From 09ea182f86f435e28c2492e3d5e9849a5d78e024 Mon Sep 17 00:00:00 2001 From: Protonmatter <102541048+Protonmatter@users.noreply.github.com> Date: Wed, 23 Sep 2026 23:56:25 +0000 Subject: [PATCH 1/2] Add optional Enhanced Earth oceans, clouds and shadows --- README.md | 10 ++ apps/web/index.html | 4 + apps/web/js/atmosphereColumnField.js | 10 +- apps/web/js/atmosphereColumnManifest.js | 4 +- apps/web/js/earthOceanMask.js | 6 + apps/web/js/enhancedEarth.js | 68 +++++++ apps/web/js/orrery.js | 72 +++++++- apps/web/js/orreryShaders.js | 35 +++- apps/web/js/planetAppearance.js | 12 +- docs/IMPLEMENTATION_PLAN.md | 13 +- docs/REQUIREMENTS.md | 1 + docs/SPEC.md | 13 ++ docs/STATUS.md | 10 +- docs/requirements.json | 23 +++ docs/rfcs/0008-enhanced-earth.md | 107 +++++++++++ docs/validation/enhanced-earth/README.md | 92 ++++++++++ docs/validation/enhanced-earth/comparison.jpg | Bin 0 -> 238889 bytes docs/validation/enhanced-earth/gl-probe.json | 29 +++ tests/python/test_earth_ocean_mask.py | 24 +++ tests/python/test_release_artifact.py | 1 + tests/web/enhancedEarth.test.mjs | 166 ++++++++++++++++++ tests/web/helpers/orreryHarness.mjs | 1 + tests/web/illustrativeHaze.test.mjs | 2 +- tools/build_web.py | 2 +- tools/enhanced_earth_probe.mjs | 14 ++ tools/prepare_earth_ocean_mask.py | 116 ++++++++++++ tools/render_enhanced_earth_probe.py | 126 +++++++++++++ 27 files changed, 944 insertions(+), 17 deletions(-) create mode 100644 apps/web/js/earthOceanMask.js create mode 100644 apps/web/js/enhancedEarth.js create mode 100644 docs/rfcs/0008-enhanced-earth.md create mode 100644 docs/validation/enhanced-earth/README.md create mode 100644 docs/validation/enhanced-earth/comparison.jpg create mode 100644 docs/validation/enhanced-earth/gl-probe.json create mode 100644 tests/python/test_earth_ocean_mask.py create mode 100644 tests/web/enhancedEarth.test.mjs create mode 100644 tools/enhanced_earth_probe.mjs create mode 100644 tools/prepare_earth_ocean_mask.py create mode 100644 tools/render_enhanced_earth_probe.py diff --git a/README.md b/README.md index fd37277d..2a549de9 100644 --- a/README.md +++ b/README.md @@ -113,3 +113,13 @@ Sol is not for navigation, occultation prediction, mission safety or operational space-weather warnings. `space_weather_operational` remains false. Project code is MIT OR Apache-2.0; third-party data attribution and outstanding coefficient notice correspondence are documented separately and are not resolved by that project license. + +### Optional Enhanced Earth + +Solar System → View controls → Earth layers → **Enhanced Earth** adds darker +offshore oceans and an elevated historical NASA cloud layer with Sun-directed +shadows. Clouds drift independently during Play time and freeze when paused. +The option is off by default; cloud height, motion and lighting are illustrative. +MODIS swaths and the scientific sea-ice palette suspend the enhancement. +See [RFC 0008](docs/rfcs/0008-enhanced-earth.md) and the +[validation record](docs/validation/enhanced-earth/README.md). diff --git a/apps/web/index.html b/apps/web/index.html index 5f757864..bd797410 100644 --- a/apps/web/index.html +++ b/apps/web/index.html @@ -25,6 +25,8 @@ + + @@ -455,6 +457,8 @@

Tools

Earth layers
+ +

Deeper oceans and raised clouds with Sun-aligned shadows. Clouds drift independently during Play time. Color, nominal 8 km cloud height and motion are illustrative; the NASA imagery keeps its historical date. Uses the Blue Marble cloud layer; suspended for MODIS swaths and the sea-ice analysis palette.

diff --git a/apps/web/js/atmosphereColumnField.js b/apps/web/js/atmosphereColumnField.js index f957c67a..7925e9fa 100644 --- a/apps/web/js/atmosphereColumnField.js +++ b/apps/web/js/atmosphereColumnField.js @@ -213,16 +213,16 @@ vec3 atmosphereCombinedTail(float impact,float x){ // Rationalize altitude before lookup: subtracting a rounded body-sized radius // quantizes a short interval's height increment and corrupts its column mass. float radius=length(vec2(impact,x)),height=((impact-u_atmosphereRadiusKm)*(impact+u_atmosphereRadiusKm)+x*x)/(radius+u_atmosphereRadiusKm); - vec3 packed; + vec3 columnValues; if(height<0.0){ float ground=sqrt(max(0.0,u_atmosphereRadiusKm*u_atmosphereRadiusKm-impact*impact)); float below=max(0.0,ground-x); - packed=atmosphereOutwardPacked(0.0,ground/u_atmosphereRadiusKm)+vec3(below,below,below*atmosphereOzoneDensity(0.0)); - }else packed=atmosphereOutwardPacked(height,x/max(radius,1e-9)); + columnValues=atmosphereOutwardPacked(0.0,ground/u_atmosphereRadiusKm)+vec3(below,below,below*atmosphereOzoneDensity(0.0)); + }else columnValues=atmosphereOutwardPacked(height,x/max(radius,1e-9)); // A uniform scale, not a literal zero, keeps the admitted sampler from being // constant-folded out of the generator. The runtime value stays 0. - packed.xy+=texelFetch(u_atmosphereColumnField,ivec2(0),0).rg*u_atmosphereColumnKeep; - return packed; + columnValues.xy+=texelFetch(u_atmosphereColumnField,ivec2(0),0).rg*u_atmosphereColumnKeep; + return columnValues; } vec2 atmosphereOutwardColumns(float height,float mu){return atmosphereOutwardPacked(height,mu).rg;} float atmosphereOzoneOutward(float height,float mu){return atmosphereOutwardPacked(height,mu).b;} diff --git a/apps/web/js/atmosphereColumnManifest.js b/apps/web/js/atmosphereColumnManifest.js index 12d8bcce..ee7e6dde 100644 --- a/apps/web/js/atmosphereColumnManifest.js +++ b/apps/web/js/atmosphereColumnManifest.js @@ -13,7 +13,7 @@ export const ATMOSPHERE_COLUMN_FIELDS=Object.freeze({ "profile_encoding": "atmosphere-profile-binary32-v1", "profile_sha256": "e15e53579417f828a4f02b401d2c9ddebd78c6f956f5177d1def336ac7d7bed8", "generator_source_sha256": "6c7c90d4a4b72fc4d9c38bdb191889780e2f3a2cf44375cfe00f87c82c2fb48c", - "field_source_sha256": "26f9171d8db660af0bbe46b7631ec89b86895e143a181aaa13c2d6afce2115f1", + "field_source_sha256": "7da48dcd0061e244de4365de8e8ba1acbce7d27a79a42cbebcda6784ae05ed44", "solver_source_sha256": "282d74036c31b418ca8e1e43f9fdb4f975cf3ec03e3217da801d54ec945aa635", "profile_source_sha256": "b8ad270b14c4ef16affc7c31bd7fb5111895bc9cc6332cbe7c8c171d4582b965" }, @@ -30,7 +30,7 @@ export const ATMOSPHERE_COLUMN_FIELDS=Object.freeze({ "profile_encoding": "atmosphere-profile-binary32-v1", "profile_sha256": "28e25e74130b1a426f07004ebdc66ca6c8f1094433f305302dab4c7338b15d7e", "generator_source_sha256": "6c7c90d4a4b72fc4d9c38bdb191889780e2f3a2cf44375cfe00f87c82c2fb48c", - "field_source_sha256": "26f9171d8db660af0bbe46b7631ec89b86895e143a181aaa13c2d6afce2115f1", + "field_source_sha256": "7da48dcd0061e244de4365de8e8ba1acbce7d27a79a42cbebcda6784ae05ed44", "solver_source_sha256": "282d74036c31b418ca8e1e43f9fdb4f975cf3ec03e3217da801d54ec945aa635", "profile_source_sha256": "b8ad270b14c4ef16affc7c31bd7fb5111895bc9cc6332cbe7c8c171d4582b965" } diff --git a/apps/web/js/earthOceanMask.js b/apps/web/js/earthOceanMask.js new file mode 100644 index 00000000..bc7d25fb --- /dev/null +++ b/apps/web/js/earthOceanMask.js @@ -0,0 +1,6 @@ +// GENERATED by tools/prepare_earth_ocean_mask.py. Public-domain Natural Earth. +// Conservative offshore display mask, not a qualified coastline or reflectance map. +export const OCEAN_MASK_WIDTH=512,OCEAN_MASK_HEIGHT=256; +export const OCEAN_MASK_SOURCES={"ne_110m_land.geojson":"9e0729ee253ca7d7a5c4ae9395fb1902264c5377c52e224d13dd85010e2835d9","ne_110m_glaciated_areas.geojson":"e61e3f45e22f087f861ac2fda6258fc15c849a216d74c27ccf0164eeafbd950a"}; +export const OCEAN_MASK_SHA256='0644b40d075dc4da2ed10928a6dbc40f2924ceaff9a300948b2f2c8781ca2bdf'; +export const OCEAN_MASK_RUNS=[0,3782,24,422,38,17,41,408,104,404,120,150,5,234,123,42,11,28,9,55,13,231,123,31,25,25,9,55,15,216,7,6,123,30,26,25,9,55,20,211,136,30,26,25,9,55,23,197,8,3,131,35,26,25,9,55,23,186,19,3,128,38,26,90,24,182,152,38,22,50,13,34,30,173,152,40,20,44,19,27,38,29,15,128,67,5,80,43,8,1,8,41,22,22,43,29,23,117,70,6,79,44,6,50,23,22,43,29,23,117,71,7,75,101,24,14,58,2,10,10,23,116,72,22,60,99,20,3,13,4,72,8,23,115,76,21,57,99,16,8,89,9,22,40,5,70,81,17,55,100,13,9,123,36,8,21,15,34,84,15,54,60,13,27,11,10,136,24,8,18,32,12,95,13,52,55,19,27,11,10,136,11,7,6,8,16,142,12,52,53,27,21,11,1,177,12,146,13,51,50,35,16,191,10,149,10,51,48,40,2,7,1,196,8,150,9,49,49,42,1,210,2,125,2,26,7,45,9,6,36,381,2,26,7,42,1,17,34,383,1,27,7,35,8,18,32,384,1,27,7,33,10,18,31,413,8,30,12,18,29,414,9,26,16,18,26,250,2,12,1,149,14,21,21,16,24,251,6,9,2,148,14,20,23,14,24,252,10,5,2,111,1,36,15,19,26,6,29,252,15,113,6,31,16,16,63,251,16,110,9,32,16,14,64,248,19,109,18,25,16,13,64,244,23,110,17,26,19,9,49,7,8,241,26,31,2,78,16,27,20,6,50,9,6,240,35,20,11,77,11,27,76,9,7,228,46,17,16,77,9,29,74,9,7,20,2,175,16,15,44,19,22,77,3,30,73,10,10,16,2,174,17,15,44,19,23,113,65,15,9,190,19,15,44,12,31,112,63,18,8,192,17,15,44,10,33,114,61,19,2,201,13,13,46,6,37,114,61,222,13,13,89,114,61,222,13,12,90,114,61,222,14,10,92,113,61,223,13,9,93,5,1,107,61,223,13,7,101,110,64,217,13,6,102,111,63,217,121,111,63,217,123,95,1,13,65,215,124,108,65,214,127,106,65,214,127,96,2,8,67,212,127,96,4,6,68,214,124,96,68,224,124,94,70,224,124,91,73,58,2,151,1,12,124,89,75,210,2,12,124,82,82,208,4,12,124,82,82,21,4,178,9,9,127,82,82,21,4,177,10,7,129,77,87,19,6,6,1,169,10,8,129,76,88,18,7,176,9,9,130,75,88,17,4,180,6,12,130,74,89,41,1,159,6,12,131,72,90,40,3,158,1,16,133,70,91,39,4,7,2,139,2,24,134,70,91,33,1,5,5,6,2,139,2,24,135,69,92,32,22,134,4,24,136,68,91,37,6,6,10,130,4,24,136,67,92,39,2,10,8,131,3,22,141,62,93,41,1,149,7,14,147,59,94,191,7,10,151,57,96,192,7,6,155,55,96,193,7,6,155,55,95,194,7,5,157,55,92,196,169,42,1,12,91,197,170,33,2,5,6,8,90,197,171,31,15,8,89,198,171,30,16,8,89,198,172,29,17,11,84,199,175,26,17,11,83,200,175,26,15,13,83,200,175,25,15,14,82,113,6,82,110,5,62,23,9,21,81,113,7,81,110,7,61,23,5,25,80,113,8,80,110,8,60,5,1,18,4,27,78,113,9,71,2,5,111,8,67,17,4,34,71,113,9,67,122,8,67,30,8,19,69,112,11,29,3,31,127,6,67,30,9,18,69,111,16,25,3,31,9,7,112,5,67,30,9,18,70,109,18,23,5,30,9,7,112,5,68,29,9,18,69,110,18,21,8,28,10,7,186,32,5,18,69,109,19,20,10,27,10,7,189,31,3,7,2,5,73,108,20,19,11,25,12,7,190,30,90,107,21,17,13,25,12,7,193,27,90,103,25,17,13,25,12,9,194,24,90,102,27,13,17,24,12,10,199,18,12,5,73,100,29,13,21,20,12,11,199,17,10,9,71,101,29,12,21,20,13,11,201,13,8,14,69,101,29,12,21,20,13,11,204,11,7,24,59,101,29,12,22,19,10,14,205,41,59,101,30,12,21,19,9,15,206,41,59,100,30,12,21,19,9,16,206,42,59,98,31,12,20,18,10,16,206,43,58,97,32,12,20,7,2,7,12,16,208,42,59,95,33,11,20,15,11,7,1,10,209,45,55,95,33,11,20,14,11,6,3,10,212,45,52,94,35,10,16,15,13,9,1,10,213,45,52,93,38,7,16,15,11,11,1,10,218,41,53,90,40,6,16,15,11,11,3,8,218,42,53,21,1,67,62,15,10,12,4,6,217,44,54,17,4,66,63,16,6,15,227,45,55,6,14,64,64,16,4,17,8,5,213,46,80,58,66,15,3,32,211,47,80,58,67,14,3,32,211,49,78,57,69,13,3,32,210,53,75,55,72,12,3,40,202,55,73,54,74,12,2,46,196,58,70,52,76,13,1,48,194,63,65,52,77,37,1,27,190,65,63,51,79,12,1,23,1,30,186,67,62,50,80,12,2,22,1,31,5,6,174,70,60,48,82,11,2,22,1,32,1,9,174,70,61,46,84,12,2,20,1,45,171,70,62,45,85,22,2,9,10,37,170,71,61,44,87,18,5,9,12,35,171,70,62,43,88,20,2,9,12,40,166,70,62,43,90,34,7,28,1,11,167,69,63,42,90,34,12,20,5,13,165,68,63,43,91,32,12,22,8,8,165,67,65,43,95,27,12,22,8,8,166,66,65,43,104,18,5,5,6,18,9,7,166,65,66,43,108,12,4,13,3,6,1,9,9,7,167,64,65,44,7,6,96,10,4,14,2,7,3,7,183,63,66,44,7,6,110,14,2,7,194,61,66,45,6,7,104,20,2,9,192,60,67,45,5,9,102,21,2,10,26,5,161,58,68,45,3,11,101,22,2,10,26,5,16,2,143,58,68,45,1,13,100,24,1,10,26,6,11,6,144,57,68,45,1,13,98,38,25,6,11,6,145,56,68,45,1,13,98,38,25,6,9,8,146,55,68,44,2,13,97,39,26,5,9,8,148,52,69,43,3,12,97,41,25,5,9,6,152,50,69,41,5,11,95,46,37,6,153,49,69,40,6,11,92,50,18,5,13,6,154,48,69,39,6,12,90,52,18,6,172,48,70,37,7,12,89,54,17,8,170,47,71,37,7,11,89,56,16,8,170,46,73,36,7,11,89,57,15,8,170,46,73,36,7,11,88,59,15,7,170,45,75,35,7,10,89,60,15,6,169,45,76,35,7,10,89,61,189,41,80,34,8,10,89,61,189,39,83,33,8,9,90,61,189,37,85,31,11,8,90,61,189,36,86,30,110,61,188,37,86,30,110,61,188,37,87,29,111,60,188,37,87,28,112,60,188,37,88,27,113,59,188,36,90,25,114,59,188,35,91,24,116,58,188,34,93,22,117,58,188,33,95,21,117,58,187,33,96,19,119,22,2,33,25,5,158,32,97,18,120,18,9,30,25,6,156,33,97,16,122,16,12,28,26,6,156,32,98,9,129,10,18,27,27,8,153,31,239,7,23,24,27,8,153,28,274,21,28,12,149,28,276,19,29,11,149,28,276,18,31,10,149,27,277,18,31,10,149,26,281,13,30,13,149,21,290,9,29,13,149,22,290,9,28,13,150,21,291,9,27,13,151,20,292,9,25,14,152,20,292,9,23,14,154,20,293,7,23,14,154,19,295,6,24,13,155,18,326,12,156,18,326,11,157,18,326,10,157,19,187,5,134,9,158,19,187,6,300,19,187,6,300,18,188,6,300,16,5,9,176,6,301,15,5,9,176,6,301,14,6,9,483,15,5,9,483,17,3,9,484,17,495,17,496,16,498,14,501,11,4101,6,502,10,499,13,498,14,224,5,41,5,220,17,151,12,40,5,14,10,4,10,18,12,218,14,151,18,34,18,1,72,204,11,150,34,16,97,204,11,133,5,7,43,9,105,193,16,133,56,8,115,184,17,109,8,11,60,2,126,179,18,91,96,1,131,171,23,68,261,121,12,26,24,66,264,118,14,6,5,15,24,64,266,84,6,1,5,22,30,2,33,59,270,84,6,1,17,10,65,59,270,68,46,4,65,58,271,57,126,54,274,58,126,46,281,55,129,41,284,45,138,41,285,41,143,19,11,8,292,39,137,24,13,7,292,39,131,14,5,9,15,7,292,39,133,5,13,4,19,7,292,39,151,4,19,5,294,40,8,1,141,4,314,53,142,1,317,52,466,23,8,15,471,9,23,12,5085]; diff --git a/apps/web/js/enhancedEarth.js b/apps/web/js/enhancedEarth.js new file mode 100644 index 00000000..7b594159 --- /dev/null +++ b/apps/web/js/enhancedEarth.js @@ -0,0 +1,68 @@ +// Illustrative presentation only. Source images, epochs and ephemerides are immutable. +import {OCEAN_MASK_WIDTH,OCEAN_MASK_HEIGHT,OCEAN_MASK_RUNS} from './earthOceanMask.js'; +import {rotationDisplayStepSeconds} from './orreryTime.js'; + +export const EARTH_CLOUD_HEIGHT_KM=8; +export const ENHANCED_EARTH_UNIFORMS=['u_earthEnhanced','u_earthCloudShadow','u_cloudPhase','u_cloudScale','u_oceanMask']; + +export function enhancedEarthSelected(state){ + return state.earthEnhanced===true&&state.useTextures!==false&&state.earthCloudSource!=='daily'&&state.earthIce!==true&&!state.galaxy; +} + +export function advanceEarthCloudPhase(phase,realSeconds,simulatedSeconds,rotationHours,enabled){ + if(!enabled||!Number.isFinite(realSeconds)||realSeconds<=0)return phase; + const seconds=rotationDisplayStepSeconds(realSeconds,simulatedSeconds,rotationHours); + if(seconds===0)return phase; + const drift=seconds/(Math.abs(rotationHours)*3600)*.03; + if(!Number.isFinite(drift))return phase; + const step=Math.sign(drift)*Math.min(Math.abs(drift),.002*realSeconds); + return ((phase+step)%1+1)%1; +} + +export function oceanMaskPixels(){ + const pixels=new Uint8Array(OCEAN_MASK_WIDTH*OCEAN_MASK_HEIGHT); + let offset=0,value=0; + for(const run of OCEAN_MASK_RUNS){pixels.fill(value,offset,offset+run);offset+=run;value=255-value;} + return pixels; +} + +export function uploadOceanMask(gl){ + const texture=gl.createTexture(); + if(!texture)throw new Error('Ocean mask allocation failed'); + try{ + gl.activeTexture(gl.TEXTURE0+11);gl.bindTexture(gl.TEXTURE_2D,texture); + gl.texImage2D(gl.TEXTURE_2D,0,gl.R8,OCEAN_MASK_WIDTH,OCEAN_MASK_HEIGHT,0,gl.RED,gl.UNSIGNED_BYTE,oceanMaskPixels()); + gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MIN_FILTER,gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MAG_FILTER,gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_WRAP_S,gl.REPEAT); + gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_WRAP_T,gl.CLAMP_TO_EDGE); + if(gl.getError()!==gl.NO_ERROR)throw new Error('Ocean mask upload failed'); + return texture; + }catch(error){gl.deleteTexture(texture);throw error;} + finally{gl.activeTexture(gl.TEXTURE0);} +} + +// Input p is on the unit sphere before oblate scaling. Return a point on the +// homothetic cloud ellipsoid in those same unflattened coordinates. The rational +// root avoids subtractive cancellation for a thin shell and an overhead Sun. +export const EARTH_CLOUD_GEOMETRY_GLSL=` +vec3 earthCloudHit(vec3 p,vec3 light,float oblate,float shell){ + vec3 d=vec3(light.xy,light.z/oblate); + float a=dot(d,d),b=dot(p,d),c=dot(p,p)-shell*shell; + float root=sqrt(max(0.0,b*b-a*c)); + float t=b>=0.0 ? -c/max(root+b,1e-12) : (root-b)/max(a,1e-12); + return p+d*t; +} +`; + +// The mask excludes coarse land/ice/coastal margins. Dark-blue gating additionally +// protects bright ice, land-like colors and islands omitted by the coarse vectors. +export const EARTH_OCEAN_GLSL=` +vec3 enhancedOceanColor(vec3 c,float ocean){ + float blue=max(0.0,c.z-max(c.x,c.y)); + float bright=max(c.x,max(c.y,c.z)); + float weight=ocean*min(1.0,blue/.03)*min(1.0,max(0.0,(.25-bright)/.1)); + float luminance=dot(c,vec3(.2126,.7152,.0722)); + return c*(1.0-weight)+(c*.8+vec3(luminance)*.2)*.55*weight; +} +`; diff --git a/apps/web/js/orrery.js b/apps/web/js/orrery.js index a6756a61..62cafed7 100644 --- a/apps/web/js/orrery.js +++ b/apps/web/js/orrery.js @@ -17,6 +17,7 @@ import { store } from "./store.js?v=dcca6290db"; import { createShaderPrograms } from "./shaderPrograms.js"; import { linearFilterReference } from './materialColor.js'; +import {EARTH_CLOUD_HEIGHT_KM,ENHANCED_EARTH_UNIFORMS,enhancedEarthSelected,advanceEarthCloudPhase,uploadOceanMask} from './enhancedEarth.js'; import { createHdrPresentation } from './hdrPresentation.js'; import { srgbToLinear } from './surfaceMapping.js'; import { appearanceReference, appearanceReferences, appearanceUniforms, appearanceFallbackColor, earthLayerDescription, earthCloudRole, surfaceReferenceShown } from "./planetAppearance.js"; @@ -160,6 +161,7 @@ const state = (store.orrery = { galSpeed: 2, // galaxy-view rate (millions of years per real second), decoupled from the planetary rate showOrbits: true, showSky: true, showConst: false, showLabels: true, showSunEq: false, useTextures: true, galaxy: false, earthNight: true, earthWeather: true, earthIce: false, earthCloudSource: 'composite', venusRadar: false, + earthEnhanced:false, earthCloudPhase:0, earthMaskStatus:'deferred', appearanceStatus: {}, terrainEnabled:true, opticsEnabled:true, terrainStatus:{}, terrainRendered:{}, opticsStatus:{}, scatteringStatus:{}, scatteringFrame:null, programStatus:{base:'deferred',physical:'deferred'},programDiagnostics:{}, @@ -194,6 +196,7 @@ const DRAW_LIST = ["Sun", ...PLANET_ORDER, "Moon"]; // live in orreryMath.js; GLSL sources in orreryShaders.js — both imported above.) // ---------------------------------------------------------------- WebGL2 renderer +let earthOceanMask=null; let gl, P = {}, sphere, quadBuf, cel, celBufs = {}, particles = null; let shaderPrograms=null,programContextGeneration=0; let hdrPresentation=null,hdrFailure=null,contextGeneration=0,sceneSerial=0,linearFrame=false,graphicsLifecycle=0; @@ -864,7 +867,7 @@ function finishGL(){ P.glowU = uloc(P.glow, ["u_vp", "u_center", "u_right", "u_up", "u_size", "u_color", "u_pow"]); Object.assign(P.sphereU,uloc(P.sphere,[...ATMOSPHERE_UNIFORMS,...INCIDENT_FIELD_UNIFORMS,'u_atmosphereColumnField','u_atmosphereOzoneField','u_bodyRadiusKm','u_terrainHeight','u_terrainShadowEnabled','u_terrainShape','u_terrainPoles'])); P.solarU=uloc(P.solar,['u_mvp','u_camObj','u_pass','u_extent','u_atlas','u_quiet','u_frameMix','u_phase','u_displayGain','u_coronaGlow','u_cmeProgress','u_cmeAxis','u_sourceBasis0','u_sourceBasis1','u_projection0','u_projection1','u_observerRadii','u_loopNormal[0]','u_loopTangent[0]','u_loopGain[0]']); - Object.assign(P.sphereU,uloc(P.sphere,['u_textureLinear'])); + Object.assign(P.sphereU,uloc(P.sphere,['u_textureLinear',...ENHANCED_EARTH_UNIFORMS])); for(const name of ['sphere','line','ring','pt','glow','solar']) Object.assign(P[`${name}U`],uloc(P[name],['u_linearOutput'])); @@ -1933,6 +1936,55 @@ function updateEarthLayerStatus() { if (caption) caption.textContent = `${ice?.label || 'Sea ice unavailable'} · ${ice?.observation_label || 'Date unavailable'}. Transparent areas have no displayed data.`; } +function prepareEarthEnhancement(body,referenceReady) { + const selected=body==='Earth'&&referenceReady&&enhancedEarthSelected(state); + if(selected&&!earthOceanMask&&state.earthMaskStatus!=='unavailable'){ + try{earthOceanMask=uploadOceanMask(gl);state.earthMaskStatus='ready';} + catch(error){state.earthMaskStatus='unavailable';console.warn('Enhanced Earth:',error.message);} + updateEarthLayerStatus(); + } + const asset=appearanceReference('Earth','cloud-composite'); + const clouds=selected&&state.earthWeather&&referenceTextures[asset.id]?.ready ? referenceTextures[asset.id] : null; + return {selected,clouds,phase:state.earthCloudPhase,scale:1+EARTH_CLOUD_HEIGHT_KM/BODY.Earth.radiusKm}; +} + +function bindEarthEnhancement(enhancement,locations) { + gl.uniform1i(locations.u_earthEnhanced,enhancement.selected&&earthOceanMask?1:0); + gl.uniform1i(locations.u_earthCloudShadow,enhancement.clouds?1:0); + gl.uniform1f(locations.u_cloudPhase,enhancement.phase); + gl.uniform1f(locations.u_cloudScale,enhancement.scale); + gl.activeTexture(gl.TEXTURE0+11);gl.bindTexture(gl.TEXTURE_2D,earthOceanMask||whiteTex); + gl.uniform1i(locations.u_oceanMask,11);gl.activeTexture(gl.TEXTURE0); + // Keep its sampler bound for the shadow, but remove the flattened cloud blend. + if(enhancement.clouds)gl.uniform1i(locations.u_earthWeather,0); +} + +function drawEarthClouds(enhancement,pos,rot,rEq,rPol,vp,eye,light,normals,reference) { + const u=P.sphereU,model=mul(translate(pos),mul(rot,scaleM([rEq*enhancement.scale,rEq*enhancement.scale,rPol*enhancement.scale]))); + gl.useProgram(P.sphere);setAtmosphereUniforms(gl,u,null); + gl.uniform1i(u.u_linearOutput,linearFrame?1:0); + gl.uniformMatrix4fv(u.u_mvp,false,new Float32Array(mul(vp,model))); + gl.uniformMatrix4fv(u.u_model,false,new Float32Array(model)); + gl.uniformMatrix3fv(u.u_nmat,false,new Float32Array(normals)); + gl.uniform3fv(u.u_cam,new Float32Array(eye));gl.uniform3fv(u.u_light,new Float32Array(light)); + gl.uniform1f(u.u_oblate,BODY.Earth.polarKm/BODY.Earth.radiusKm); + gl.uniform1i(u.u_mode,3);gl.uniform1i(u.u_style,-1); + gl.uniform1i(u.u_earthNight,0);gl.uniform1i(u.u_earthIce,0);gl.uniform1i(u.u_earthWeather,0); + gl.uniform1i(u.u_earthEnhanced,0);gl.uniform1i(u.u_earthCloudShadow,0); + gl.uniform1f(u.u_cloudPhase,enhancement.phase);gl.uniform1f(u.u_cloudScale,enhancement.scale); + const uniforms=appearanceUniforms(reference); + gl.uniform4fv(u.u_map,new Float32Array(uniforms.map)); + gl.uniform4fv(u.u_mapLat,new Float32Array(uniforms.lat)); + gl.uniform4fv(u.u_mapWindow,new Float32Array(uniforms.window)); + gl.activeTexture(gl.TEXTURE0+3);gl.bindTexture(gl.TEXTURE_2D,enhancement.clouds.tex);gl.uniform1i(u.u_weatherTex,3); + gl.activeTexture(gl.TEXTURE0); + setHazeUniforms(gl,u,getAtmosphereProfile('Earth')); + bindBodyMesh();gl.enable(gl.CULL_FACE);gl.cullFace(gl.BACK);gl.depthMask(false); + gl.blendFunc(gl.SRC_ALPHA,gl.ONE_MINUS_SRC_ALPHA); + gl.drawElements(gl.TRIANGLES,sphere.count,gl.UNSIGNED_SHORT,0); + gl.depthMask(true);gl.disable(gl.CULL_FACE); +} + function bindEarthTextures(enabled,locations=P.sphereU) { for (const [role, active, flag, sampler, unit] of /** @type {[string,boolean,string,string,number][]} */ ([ ['night-lights', state.earthNight, 'u_earthNight', 'u_nightTex', 2], @@ -2067,6 +2119,8 @@ function drawBody(b, vp, eye) { gl.uniform1i(sphereUniforms.u_mapNoData, uniforms.nodata); } bindEarthTextures(!!referenceTex && b.name === 'Earth',sphereUniforms); + const earthEnhancement=prepareEarthEnhancement(b.name,!!referenceTex); + bindEarthEnhancement(earthEnhancement,sphereUniforms); gl.uniform3fv(sphereUniforms.u_sunA, new Float32Array(sunTexd ? sunDiskBasis() : [1, 0, 0])); // Ring-shadow inputs: the light direction expressed in the BODY frame (Rᵀ·light — rot's // upper 3×3 is orthonormal, column-major), the annulus radii in equatorial-radius units, the @@ -2097,6 +2151,8 @@ function drawBody(b, vp, eye) { gl.drawElements(gl.TRIANGLES,mesh.count,mesh.indexType||gl.UNSIGNED_SHORT,0); gl.disable(gl.CULL_FACE); + if(earthEnhancement.clouds)queueTransparent(pos,eye,()=>drawEarthClouds(earthEnhancement,pos,rot,rEq,rPol,vp,eye,light,normals,reference)); + // atmosphere limb halo (additive shell, slightly larger, no depth write) if (atmoStr > 0 && b.name !== "Sun" && b.name !== "Earth" && !profile) { // A restrained illustrative optical limb, not an atmospheric-height measurement. @@ -2291,6 +2347,7 @@ function drawMoons(parentName, parentPos, parentDisplayAU, vp, eye, drawn) { gl.uniform1i(P.sphereU.u_mapNoData, uniforms.nodata); } bindEarthTextures(false); // auxiliary layers must never leak from Earth onto moons + bindEarthEnhancement({selected:false,clouds:null,phase:0,scale:1},P.sphereU); gl.uniform1f(P.sphereU.u_oblate, 1); gl.uniform2fv(P.sphereU.u_ringRad, new Float32Array([0, 0])); // no ring shadow on moons — clear the parent's state // Nor a moon shadow ON a moon: mutual Galilean events are real but they need each moon's @@ -2676,6 +2733,10 @@ function tick(now) { finishPositionUpdate(); stepParticles(dt); updateRotationDisplay(dt); + const cloudAsset=appearanceReference('Earth','cloud-composite'); + const drift=enhancedEarthSelected(state)&&state.earthWeather&&!prefersReducedMotion() + &&referenceVisible.get('Earth')>=2&&referenceTextures[cloudAsset.id]?.ready; + state.earthCloudPhase=advanceEarthCloudPhase(state.earthCloudPhase,dt,state.simStepSeconds,BODY.Earth.rotationHours,drift); } } } @@ -3347,8 +3408,12 @@ async function showFallback(msg) { if(solarDetail?.status('reference')==='unavailable')solarDetail.retry('reference'); syncSolarPlaybackControls();paint(); }); - for (const [id, key] of [['orreryEarthNight', 'earthNight'], ['orreryEarthWeather', 'earthWeather'], ['orreryEarthIce', 'earthIce']]) { - bind(id, 'change', e => { state[key] = inputTarget(e).checked; updateEarthLayerStatus(); paint(); updateOrreryAccuracy(); }); + for (const [id, key] of [['orreryEarthEnhanced', 'earthEnhanced'], ['orreryEarthNight', 'earthNight'], ['orreryEarthWeather', 'earthWeather'], ['orreryEarthIce', 'earthIce']]) { + bind(id, 'change', e => { + state[key] = inputTarget(e).checked; + if(key==='earthEnhanced'&&state[key]&&state.earthMaskStatus==='unavailable')state.earthMaskStatus='deferred'; + updateEarthLayerStatus(); paint(); updateOrreryAccuracy(); + }); } bind('orreryVenusRadar', 'change', e => { state.venusRadar = inputTarget(e).checked; updatePhysicalAppearance(); paint(); updateOrreryAccuracy(); }); bind('orreryEarthCloudSource', 'change', e => { @@ -3427,6 +3492,7 @@ async function showFallback(msg) { scatteringTargets?.dispose();scatteringTargets=null;scatteringFrame=null;state.scatteringFrame=null;state.scatteringStatus={}; hdrPresentation?.dispose();hdrPresentation=null;linearFrame=false;state.hdrFrame=null; state.hdrStatus={state:'deferred',reason:'Graphics context lost.'}; + if(earthOceanMask)gl.deleteTexture(earthOceanMask);earthOceanMask=null;state.earthMaskStatus='deferred'; gl = null; P = {}; textures = {}; sunTex = { ready: false, tex: null }; ringTex = { ready: false, tex: null }; cancelPendingReferenceTextures(); diff --git a/apps/web/js/orreryShaders.js b/apps/web/js/orreryShaders.js index f42c1cd7..d66ded19 100644 --- a/apps/web/js/orreryShaders.js +++ b/apps/web/js/orreryShaders.js @@ -8,6 +8,8 @@ import { INCIDENT_FIELD_GLSL } from './atmosphereIncident.js'; import { TERRAIN_SHADOW_GLSL } from './terrainShadowShaders.js'; import { DISPLAY_COMPOSITION_GLSL } from './materialColor.js'; import { RING_TRANSPORT_GLSL } from './ringTransportShaders.js'; +import {EARTH_CLOUD_GEOMETRY_GLSL,EARTH_OCEAN_GLSL} from './enhancedEarth.js'; +export {EARTH_CLOUD_GEOMETRY_GLSL,EARTH_OCEAN_GLSL}; const NOISE = ` float h31(vec3 p){ p=fract(p*0.3183099+0.1); p*=17.0; return fract(p.x*p.y*p.z*(p.x+p.y+p.z)); } @@ -75,6 +77,9 @@ uniform vec4 u_map; uniform vec4 u_mapLat; uniform vec4 u_mapWindow; uniform int uniform int u_earthNight; uniform int u_earthWeather; uniform int u_earthIce; uniform sampler2D u_nightTex; uniform sampler2D u_weatherTex; uniform sampler2D u_iceTex; uniform int u_textureLinear; +uniform int u_earthEnhanced,u_earthCloudShadow; +uniform float u_cloudPhase,u_cloudScale; +uniform sampler2D u_oceanMask; uniform vec3 u_hazeRayleighTau; uniform vec3 u_hazeAerosol; // Illustrative atmospheric haze for the distant, non-physical path. See // atmosphereOptics.js for the profile columns and the cited closed forms. @@ -170,6 +175,8 @@ ${ATMOSPHERE_GLSL} ${TERRAIN_SHADOW_GLSL} ${RING_TRANSPORT_GLSL} ${NOISE} +${EARTH_CLOUD_GEOMETRY_GLSL} +${EARTH_OCEAN_GLSL} // Every registered layer of a body shares one source grid. main computes this // once per fragment (u, v, source latitude) and passes it to each lookup, so the // same atan pair is not re-evaluated for every layer and coverage test. @@ -201,6 +208,11 @@ float referenceCoverage(vec3 grid,vec4 sampleColor){ if(u_mapNoData==1&&max(sampleColor.r,max(sampleColor.g,sampleColor.b))<0.00392157) return 0.0; return u_mapNoData==2 ? sampleColor.a : 1.0; } +vec4 earthCloudSample(vec3 p){ + vec2 uv=referenceGrid(p).xy; + uv.x=fract(uv.x-u_cloudPhase); + return referenceSample(u_weatherTex,p,uv); +} float spotGroup(vec3 p,vec4 s){ if(s.w<=0.0) return 0.0; float ang=acos(clamp(dot(normalize(p),normalize(s.xyz)),-1.0,1.0)); @@ -247,6 +259,17 @@ void main(){ // bright full-circumference ring that made every planet look like an annular eclipse. float day=smoothstep(-0.32,0.22,dot(N,normalize(u_light))); o=vec4(displayOutput(u_atmo*pow(1.0-clamp(dot(N,V),0.0,1.0),2.2)*u_atmoStr*1.4*(0.04+0.96*day)), 1.0); return; } + if(u_mode==3){ + // A separate, raised transparent shell. This branch is removed from the + // physical ground specialization; cloud haze remains explicitly illustrative. + vec4 clouds=earthCloudSample(p); + if(clouds.a<=0.001) discard; + float lambert=max(dot(N,normalize(u_light)),0.0); + vec3 color=decodeSRGB(coveredRGB(clouds))*(.001+.999*lambert); + vec3 path=hazeOverSurface(color,N,V,normalize(u_light),1.0); + color+=path; + o=vec4(u_linearOutput==1?color:encodeSRGB(color),clouds.a);return; + } if(u_mode==1){ if(u_style<0){ float limb=pow(clamp(dot(N,V),0.0,1.0),0.45); @@ -314,6 +337,7 @@ void main(){ vec4 mapped=referenceSample(u_tex,p,referenceGridValue.xy); vec3 sourceRGB=u_mapNoData==2 ? coveredRGB(mapped) : mapped.rgb; col=mix(decodeSRGB(u_base),u_textureLinear==1 ? sourceRGB : decodeSRGB(sourceRGB),referenceCoverage(referenceGridValue,mapped)); + if(u_earthEnhanced==1) col=enhancedOceanColor(col,referenceSample(u_oceanMask,p,referenceGridValue.xy).r); // Earth auxiliaries share the documented WGS84 pixel-area grid, 180W..180E. // Weather is the provider's dated clouds-and-surface image, never inferred clouds. if(u_earthWeather==1){ @@ -493,6 +517,13 @@ void main(){ } } sunVis*=terrainSunVisibility(surfaceBodyKm,incidentBody); + float hazeSunVis=sunVis; + if(reference&&u_earthCloudShadow==1&&dot(N,normalize(u_light))>0.0){ + // Same ellipsoid and phase as the visible clouds. Trace straight geometric + // sunlight, not a fixed UV offset; alpha is a display opacity, not optical depth. + vec3 hit=earthCloudHit(p,normalize(u_lightObj),u_oblate,u_cloudScale); + sunVis*=1.0-.35*earthCloudSample(normalize(hit)).a; + } // The shadow removes DIRECT sunlight only. The 0.05 floor is the light a planet's own // atmosphere scatters into it, which is why Io's shadow reads as very dark grey rather than // as a hole in the planet. @@ -543,7 +574,7 @@ void main(){ // shared encode below handles it; a procedural display recipe is decoded and // re-encoded so its own downstream handling stays exactly as it was. vec3 surface=reference ? col : decodeSRGB(col); - vec3 path=hazeOverSurface(surface,N,V,normalize(u_light),sunVis); + vec3 path=hazeOverSurface(surface,N,V,normalize(u_light),hazeSunVis); col=reference ? surface+path : encodeSRGB(surface+path); displayLimb=vec3(0); } @@ -618,7 +649,7 @@ export function physicalEnabledSource(source) { ' // Direct reflected sunlight sees the incident atmospheric column. The\n // single-scattering mode has no invented diffuse-ambient weather term.\n col*=lambert*sunVis*(refracted ? v_incidentTransmission : atmosphereSunTransmission(surfaceBodyKm))\n *u_atmosphereSolarScale*u_atmosphereExposure;'], [' if(u_atmosphereEnabled==1) col=atmosphereSurfaceColor(',' col=atmosphereSurfaceColor('], [' if(u_atmosphereEnabled==0)return vec3(0);\n',''], - [' if(u_atmosphereEnabled==0&&dot(u_hazeRayleighTau,vec3(1))>0.0){\n // Path radiance is linear light. A registered map is still linear here and the\n // shared encode below handles it; a procedural display recipe is decoded and\n // re-encoded so its own downstream handling stays exactly as it was.\n vec3 surface=reference ? col : decodeSRGB(col);\n vec3 path=hazeOverSurface(surface,N,V,normalize(u_light),sunVis);\n col=reference ? surface+path : encodeSRGB(surface+path);\n displayLimb=vec3(0);\n }\n',''], + [' if(u_atmosphereEnabled==0&&dot(u_hazeRayleighTau,vec3(1))>0.0){\n // Path radiance is linear light. A registered map is still linear here and the\n // shared encode below handles it; a procedural display recipe is decoded and\n // re-encoded so its own downstream handling stays exactly as it was.\n vec3 surface=reference ? col : decodeSRGB(col);\n vec3 path=hazeOverSurface(surface,N,V,normalize(u_light),hazeSunVis);\n col=reference ? surface+path : encodeSRGB(surface+path);\n displayLimb=vec3(0);\n }\n',''], ]; for(const [from,to] of rewrites){ if(source.split(from).length!==2)throw new Error('Physical enabled-flag boundary changed'); diff --git a/apps/web/js/planetAppearance.js b/apps/web/js/planetAppearance.js index c80022d7..bd26f462 100644 --- a/apps/web/js/planetAppearance.js +++ b/apps/web/js/planetAppearance.js @@ -73,7 +73,7 @@ export function appearanceSummary(body, state = {}) { export function earthLayerDescription(state = {}, compact = false) { const roles = /** @type {[string, boolean][]} */ ([['night-lights', state.earthNight !== false], [earthCloudRole(state), state.earthWeather !== false], ['sea-ice', state.earthIce === true]]); - return roles.filter(([, enabled]) => enabled).map(([role]) => { + const layers=roles.filter(([, enabled]) => enabled).map(([role]) => { const asset = appearanceReference('Earth', role); if (!asset) return `${role}: unavailable`; const status = state.appearanceStatus?.[asset.id]; @@ -82,4 +82,14 @@ export function earthLayerDescription(state = {}, compact = false) { return `${label} · ${asset.observation_label}${status === 'ready' ? '' : status === 'unavailable' ? ' · unavailable' : status === 'deferred' || !status ? ' · loads when Earth is in view at a useful scale' : status === 'queued' ? ' · queued' : ' · loading'}${limits}`; }).join(' · '); + return [layers,enhancedEarthDescription(state)].filter(Boolean).join(' · '); +} + +export function enhancedEarthDescription(state){ + if(!state.earthEnhanced)return ''; + if(state.earthCloudSource==='daily')return 'Enhanced Earth suspended for MODIS swaths containing the ground.'; + if(state.earthIce===true)return 'Enhanced Earth suspended to preserve the scientific sea-ice palette.'; + if(state.useTextures===false)return 'Enhanced Earth suspended while source textures are off.'; + const ocean=state.earthMaskStatus==='unavailable'?'Ocean grading unavailable. ':'Darker offshore oceans. '; + return `Enhanced Earth · illustrative: ${ocean}Cloud height (nominal 8 km), shadows and drift are display choices, not measured weather. Cloud lighting uses approximate haze. Drift follows Play time; reduced motion holds it.`; } diff --git a/docs/IMPLEMENTATION_PLAN.md b/docs/IMPLEMENTATION_PLAN.md index 7ebf3355..9fdb4e97 100644 --- a/docs/IMPLEMENTATION_PLAN.md +++ b/docs/IMPLEMENTATION_PLAN.md @@ -1,7 +1,7 @@ # Implementation plan Status: active -Updated: 2026-09-11 +Updated: 2026-09-23 This plan describes delivery work, while `STATUS.md` describes implemented product behavior and `ROADMAP.md` records longer-horizon product direction. @@ -47,6 +47,17 @@ Exit criteria: ## Next product increments +### Enhanced Earth review candidate + +The user approved the bounded optional mode in [RFC 0008](rfcs/0008-enhanced-earth.md). +Implementation includes guarded ocean grading, a nominal 8 km cloud shell, +Sun-directed shadows, independent rotation-gated drift, lifecycle recovery and +release-fingerprint coverage for the new rendering modules. The default remains off. +See [validation evidence](validation/enhanced-earth/README.md) for the comparison and +exact scope. Next gates are draft review, CI Rust/WASM/browser and coverage checks, +then native/mobile appearance and performance. Local source completion does not +authorize merge or production promotion. + ### Operational evidence - Calibrate physical magnetic units and publish the method. diff --git a/docs/REQUIREMENTS.md b/docs/REQUIREMENTS.md index 5e04306e..9886b696 100644 --- a/docs/REQUIREMENTS.md +++ b/docs/REQUIREMENTS.md @@ -31,6 +31,7 @@ unrecognized status, and incomplete workflow enforcement. | `SOL-VIS-005` | Numeric terrain datum, finite geometry, physical extents and source identity | | `SOL-VIS-006` | Dimensioned optical transfer with distinct reflection, scattering and emission | | `SOL-VIS-007` | Source band, frame, coverage and finite dynamic appearance playback | +| `SOL-VIS-009` | Opt-in Enhanced Earth with disclosed ocean grading, raised clouds, aligned shadows and gated drift | | `SOL-CI-001` | SHA-pinned actions, least privilege, and deployment of the tested SHA | | `SOL-DOC-001` | Documentation, plans, instructions, and traceability updated with code | | `SOL-SUPPLY-001` | Locked dependencies and automated ecosystem update review | diff --git a/docs/SPEC.md b/docs/SPEC.md index 630bd24a..883c1675 100644 --- a/docs/SPEC.md +++ b/docs/SPEC.md @@ -32,6 +32,19 @@ reuse the existing view transform without moving physical bodies. Scientific and source claims remain anchored to public methods and data: NOAA/SWPC products, Helioviewer quicklook imagery and metadata, IERS Earth-orientation data, JPL Horizons/DE441 validation, published analytic ephemerides, and NASA/IAU constants. Sol does not claim proprietary JPL, NOAA, or commercial forecasting algorithms. +[RFC 0008](rfcs/0008-enhanced-earth.md) adds an optional Enhanced Earth presentation, +off by default. It retains NASA maps and their epochs, grades dark offshore ocean +pixels, raises the historical cloud layer by a nominal 8 km, and samples that same +shell/phase for Sun-directed display shadows. Independent drift advances only with +visible Earth during Play time; pause, hidden/inactive views and reduced motion +hold its phase. MODIS ground-containing swaths and the scientific sea-ice palette +suspend enhancement. Cloud height, drift, opacity-based shadows and cloud haze +are illustrative; they are not measured weather or volumetric optical transfer. +The ground keeps its existing reference atmosphere. Source-qualified defaults, +other bodies, engine snapshots and observation dates remain unchanged. See the +[validation record](validation/enhanced-earth/README.md) for local evidence and +outstanding browser/device qualification. + Planetary appearance follows [RFC 0004](rfcs/0004-registered-planetary-appearance.md). Registered, dated mission display maps are separate from calibrated or complete observations. Earth layers distinguish land/ice, annual night lights, dated satellite diff --git a/docs/STATUS.md b/docs/STATUS.md index 8f92ffb0..c442d083 100644 --- a/docs/STATUS.md +++ b/docs/STATUS.md @@ -1,6 +1,6 @@ # Sol status -Updated: 2026-09-13. Scope: inspected local implementation, not production activation. +Updated: 2026-09-23. Scope: inspected local implementation, not production activation. ## Implementation versus qualification @@ -37,6 +37,14 @@ while a scoped, tested implementation can be submitted for code review. ## User-visible behavior implemented locally +The optional Enhanced Earth candidate (SOL-VIS-009 / Accepted RFC 0008) preserves +the default view and adds darker ocean colors, raised historical clouds, shared-phase +Sun-directed ground shadows and drift during Play time. Scientific sea-ice and MODIS +views suspend it. [Candidate validation](validation/enhanced-earth/README.md) records +renderer lifecycle checks, deterministic mask generation and an actual offscreen +production-shader comparison. Native browser/mobile and release qualification remain +open; this candidate does not change the deployed site. + Sun, My Sky and Solar System expose selected non-canvas facts, native object controls, visible mode/source/epoch/limitations and bounded lists. The timeline distinguishes idealized cycle frames from observed data and treats missing frames as gaps. diff --git a/docs/requirements.json b/docs/requirements.json index da7e9cda..4fd1eb6b 100644 --- a/docs/requirements.json +++ b/docs/requirements.json @@ -496,6 +496,29 @@ "ci_gates": [ "CI / Web, provider, and browser validation" ] + }, + { + "id": "SOL-VIS-009", + "status": "implemented", + "statement": "Enhanced Earth MUST be opt-in, preserve original NASA sources and engine state, keep cloud geometry and Sun-directed shadows phase-aligned, freeze drift outside visible animation, and suspend visual edits for ground-containing swaths or scientific sea-ice palettes. Height, motion, ocean grading and cloud lighting MUST remain disclosed as illustrative.", + "source": "docs/rfcs/0008-enhanced-earth.md#requirements", + "implementation": [ + "apps/web/js/enhancedEarth.js", + "apps/web/js/earthOceanMask.js", + "apps/web/js/orrery.js", + "apps/web/js/orreryShaders.js", + "apps/web/js/planetAppearance.js", + "apps/web/index.html", + "tools/prepare_earth_ocean_mask.py" + ], + "verification": [ + "tests/web/enhancedEarth.test.mjs", + "tests/python/test_earth_ocean_mask.py", + "tools/render_enhanced_earth_probe.py" + ], + "ci_gates": [ + "CI / Web, provider, and browser validation" + ] } ] } diff --git a/docs/rfcs/0008-enhanced-earth.md b/docs/rfcs/0008-enhanced-earth.md new file mode 100644 index 00000000..e82d9bf0 --- /dev/null +++ b/docs/rfcs/0008-enhanced-earth.md @@ -0,0 +1,107 @@ +# RFC 0008: Optional Enhanced Earth presentation + +- Status: Accepted +- Authors: Codex for Protonmatter +- Created: 2026-09-23 +- Target: Enhanced Earth review candidate +- Requirements: `SOL-VIS-009` + +## Summary + +Add an opt-in Enhanced Earth checkbox: deeper oceans, a raised historical cloud +layer, Sun-directed offset shadows and independent drift during Play time. +The owner approved this design in conversation on 2026-09-23. Acceptance authorizes +implementation; it does not qualify native graphics, merge or deployment. + +## Context + +Earth already uses NASA surface, cloud, night-light and sea-ice maps. Clouds are +currently composited on the ground. This change retains those immutable sources +and their dates. It does not import the lab's artistic Earth or simulate weather. + +## Requirements + +`SOL-VIS-009`: Enhanced Earth MUST be opt-in and disclosed as illustrative. It +MUST preserve source-qualified defaults, engine state and non-Earth materials. +Cloud geometry, shadows and drift MUST share a single map phase. Pausing time, +hidden/inactive views and reduced motion MUST stop drift. Camera redraws MUST NOT +advance phase. MODIS clouds-and-ground swaths MUST NOT be lifted or drifted. +Unavailable cloud imagery MUST NOT create opaque fallback clouds or shadows. + +## Design + +Use the existing surface and cloud resources. Grade only dark blue pixels inside +a conservative offshore mask derived offline from the committed Natural Earth +land/ice polygons. Protect bright ice; suspend enhancement for the sea-ice palette. +The mask is display support, not a qualified coastline or ocean reflectance map. + +Raise the cloud ellipsoid homothetically by a nominal 8 km at the equator +(slightly less at the poles). Reuse the sphere mesh and base program in a +transparent cloud pass, back-face culled, depth-tested and without depth writes. +The base program's existing haze approximation lights the cloud shell; this is +not dense-cloud or volumetric optical transfer. The ground retains its existing +reference atmosphere. Cloud shadows trace straight sunlight rays from the oblate +ground to this same shell and sample the same phase, attenuating direct sunlight +only. No fixed screen-space or longitude offset is used. + +Drift adds 3% of the visible Earth rotation, capped at 0.002 turns per real second, +using a bounded phase advanced once per successful animation tick. The clock is +illustrative and never alters observation dates, positions or Earth orientation. +Daily MODIS or scientific sea-ice palette selection suspends the enhancement; toggling back resumes its phase. + +## UX and accessibility + +Earth layers contains a native unchecked Enhanced Earth checkbox, a concise help +paragraph and status describing active, suspended, loading or unavailable layers. +It is independent of the other planets' appearance mode. Keyboard/touch behavior +uses existing controls; reduced motion suppresses independent cloud drift. + +## Security and privacy + +No new runtime dependencies, external requests, user data or schemas. Existing +bounded/cancellable reference loaders own NASA imagery. One 512x256 R8 mask is +uploaded lazily, retained per context and disposed on context loss. Upload failure +leaves oceans ungraded with visible status. The generated mask pins input hashes. + +## Alternatives + +A fixed UV shadow offset contradicts a moving Sun. Full volumetric clouds need +different data and performance qualification. Replacing scientific defaults would +hide display edits; a separate toggle permits direct comparison and rollback. + +## Risks + +Cloud height, opacity-to-shadow strength and drift are artistic choices, not +retrieved meteorology. Coarse vectors omit small islands; blue/brightness guards +and an offshore margin restrict grading, but the mask is not survey accuracy. +Cloud scattering uses illustrative haze; it is not the ground's qualified optical +transfer. Physical-height depth is subtle at globe scale. Native GPU/mobile visual +and performance qualification remain required; CPU draw tests cannot establish it. + +## Acceptance criteria + +1. Default/off, non-Earth, no textures and MODIS paths retain their original draws. +2. Ready composite clouds appear once on the shell; missing/off clouds cast no shadow. +3. Executed shader geometry hits the correct raised oblate shell toward the Sun; + tangent/polar/night cases are finite, and opposite light directions reverse offsets. +4. Draw tests prove shared cloud/shadow phase, elevation, depth/culling/blending, + no night-light leakage, and pause/camera/context continuity. +5. Ocean math preserves masked land, neutral/bright ice and non-blue pixels; + deterministic mask regeneration and known land/ocean/polar samples pass. + +## Validation + +Run focused shader/helper and full-renderer lifecycle tests, all Node tests, +mask regeneration, Python tests, type/static/doc/SDLC/UX gates and the web build. +Required CI retains native WebGL2, browser visual, coverage, WASM and release gates. + +## Rollout and rollback + +Submit a separate draft PR based on the existing default branch. Default is off. +Merge/deploy only after normal review and required gates. Uncheck Enhanced Earth +for immediate comparison/rollback; revert the feature commit for full removal. + +## Documentation + +Update SPEC, requirements catalogue/traceability, README, status and validation +evidence with the actual local results and remaining qualification limits. diff --git a/docs/validation/enhanced-earth/README.md b/docs/validation/enhanced-earth/README.md new file mode 100644 index 00000000..7d59c11f --- /dev/null +++ b/docs/validation/enhanced-earth/README.md @@ -0,0 +1,92 @@ +# Enhanced Earth validation record + +Date: 2026-09-23. Scope: local review candidate for RFC 0008 / SOL-VIS-009. +This record does not claim merge, deployment or native-device qualification. + +## Behavior + +Earth layers → Enhanced Earth is off by default. It reuses NASA surface/cloud +maps, protects coarse land/ice with a conservative offshore mask, and darkens +only dark blue water colors in linear light. A homothetic cloud shell is nominally +8 km above the equator. Ground shadows intersect that shell toward the Sun and +use the same drifting UV phase. The cloud pass uses illustrative haze, while the +ground retains reference optical transfer. No source image, observation epoch, +ephemeris or other body's appearance is modified. + +Cloud drift follows 3% of displayed Earth rotation, capped at 0.002 turns per real +second. Pause, hidden/inactive scenes and reduced motion freeze the phase; camera +movement never advances it. MODIS ground-containing swaths and the scientific +sea-ice palette suspend enhancement. Missing/off clouds have no shell or shadow. +Failed mask upload leaves the cloud view usable and reports ocean grading as +unavailable; switching Enhanced Earth off/on retries once. + +## Automated evidence + +- `tests/web/enhancedEarth.test.mjs` executes production renderer lifecycle and + shader geometry/color helpers. Cases cover defaults, scientific-state identity, + shell elevation, shared phase, transparent draw state, non-Earth reset, missing + maps, swath/sea-ice suspension, drift and rate caps, pause/reduced motion, active + hidden/inactive suspension, context loss and explicit upload retry. +- `tests/python/test_earth_ocean_mask.py` verifies exact offline regeneration and + rejects changed source data. The generator is standard-library-only; its + Natural Earth source hashes and the decoded pixel hash are committed. +- `tools/render_enhanced_earth_probe.py` compiles and links the actual base and + physical shaders on Linux EGL/Mesa. It renders a controlled base-haze comparison + with original NASA maps. Metamorphic checks require visible changes when + enhancement, drift or shadows change. A black-ground test verifies that cloud + shadows do not attenuate atmospheric path radiance. + +The probe initially exposed the existing GLSL local name `packed`, rejected as +a reserved token by Mesa. Renaming that local to `columnValues` changes no +formula. `node tools/prepare_atmosphere_columns.mjs` regenerated the pinned +manifest from the actual source; both 2 MiB numerical field files reproduced +byte-for-byte. No source-identity check was bypassed or weakened. + +Final candidate checks on 2026-09-23: + +| Command | Observed result | +| --- | --- | +| `npm test` | 1,323 tests passed; no failures or skips. | +| `PYTHONPATH=tools python -m unittest discover -s tests/python -p 'test_*.py' -v` | 390 tests ran; 5 errors from missing `cargo`/`rustc`, 3 skips, no assertion failures. | +| `python tools/typecheck_web.py` | 114 files clean. | +| `python tools/validate_web_static.py` | Passed. | +| `python tools/validate_sdlc.py` | 24 requirements and workflow/traceability checks passed. | +| `python tools/validate_docs.py` | 140 Markdown files passed. | +| `python tools/validate_ux_contract.py` | Structure checks passed. | +| `python tools/prepare_earth_ocean_mask.py --check` | Exact reproduction passed. | +| `python tools/render_enhanced_earth_probe.py` | Both production programs compiled/linked; image, drift, shadow and haze-isolation assertions passed. | +| `git diff --check` | Passed. | + +The five Python errors are three native snapshot subcases, the native hybrid-time +case, and local Rust toolchain evidence capture. An earlier broad rerun ended +without a summary; the complete confirmation run above finished in 46.666 seconds. +Release-artifact and ocean-mask cases passed in that full run. The new module +classification regression was also observed failing before the classifier update +and passing afterward. The release builder requires source/run metadata and valid +WASM inputs; no qualified release build was produced without the Rust/WASM toolchain. +Independent review found two minor issues (haze shadowing and an insufficiently +active suspension test); both were fixed and confirmed in focused follow-up review. + +## Reproduction + +```sh +python tools/prepare_earth_ocean_mask.py --check +node --experimental-vm-modules --test tests/web/enhancedEarth.test.mjs +PYTHONPATH=tools python -m unittest tests.python.test_earth_ocean_mask -v +python tools/render_enhanced_earth_probe.py +``` + +The optional EGL probe requires Linux libEGL, Node, NumPy, Pillow and DejaVu Sans. +It is a diagnostic, not the repository's browser/native graphics gate. The +[comparison](comparison.jpg) holds maps, camera and Sun direction constant. +[Probe metadata](gl-probe.json) records renderer, shader/source hashes and changed +pixel counts. Those counts prove an effect, not its perceptual quality or accuracy. + +## Remaining qualification + +Native WebGL2/ANGLE, Safari/iOS/mobile appearance, physical-path visual quality, +whole-web/Rust coverage and frame-time measurements require the normal CI/device +gates. CPU lifecycle tests and Mesa images do not substitute for those gates. +The cloud layer has no measured heights, evolving meteorology, multiple +scattering or volumetric structure. The offshore mask is deliberately coarse and +omits small islands; it is not qualified for glint, coastlines or ocean analysis. diff --git a/docs/validation/enhanced-earth/comparison.jpg b/docs/validation/enhanced-earth/comparison.jpg new file mode 100644 index 0000000000000000000000000000000000000000..28d0a77dcad71d28b5b1a3b67a88be6b3d889618 GIT binary patch literal 238889 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
  • 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

    ^nUAO>BRG|*p2c3e?{Br`MJCCf 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 V9{ry+mH$3#5&ZuegNVPY{{=0GgSY?y literal 0 HcmV?d00001 diff --git a/docs/validation/enhanced-earth/gl-probe.json b/docs/validation/enhanced-earth/gl-probe.json new file mode 100644 index 00000000..0b03cb56 --- /dev/null +++ b/docs/validation/enhanced-earth/gl-probe.json @@ -0,0 +1,29 @@ +{ + "renderer": "llvmpipe (LLVM 20.1.2, 256 bits)", + "version": "OpenGL ES 3.2 Mesa 25.2.8-0ubuntu0.24.04.2", + "shader_sha256": { + "base": [ + "3c07618144d40f22ddc7172915f581e8d04e1467125c75010e57ac53670a2b8c", + "b84bb0171c0951170b6bbeb8e333bdab4a476c0121bb1cfe76aed821a3804703" + ], + "physical": [ + "c1a6e6515c9c8d28d159e2fd08036edae0af72ddb69f57923a431a9cee8f2733", + "97b25bca0dfb9e0b858e390172da0f1a7004923e51205f691c254cf1fea9b767" + ] + }, + "programs_compiled": [ + "base", + "physical" + ], + "width": 768, + "height": 768, + "changed_pixels": 254959, + "drift_changed_pixels": 270921, + "shadow_changed_pixels": 63090, + "scope": "Controlled offscreen OpenGL ES software rendering of production shaders with original NASA maps; base haze path, no browser/native-device qualification.", + "source_sha256": { + "apps/web/textures/reference/earth-land-2004.jpg": "99f5faad74efe985fbf1714c8be7296ca9999759a1215b65f99b7f1df278dde5", + "apps/web/textures/reference/earth-blue-marble-2002-cloud-layer.png": "82005bba2cec05b41137b766985d516eaf6b66ea045191d8869d45abd05f7995", + "apps/web/js/earthOceanMask.js": "53fcc6ba7460e0ee701893f05b924c8fa4002fe74c31a8a6647f00a66a687e7a" + } +} diff --git a/tests/python/test_earth_ocean_mask.py b/tests/python/test_earth_ocean_mask.py new file mode 100644 index 00000000..baf7652c --- /dev/null +++ b/tests/python/test_earth_ocean_mask.py @@ -0,0 +1,24 @@ +"""The committed display mask must reproduce from pinned geography without network.""" +import tempfile +import unittest +from pathlib import Path +from unittest.mock import patch + +import prepare_earth_ocean_mask as mask + + +class EarthOceanMaskTests(unittest.TestCase): + def test_committed_mask_reproduces(self): + self.assertEqual(mask.generate(), mask.OUTPUT.read_text()) + + def test_changed_source_is_rejected_before_rasterization(self): + with tempfile.TemporaryDirectory() as tmp: + source = Path(tmp) + (source / 'ne_110m_land.geojson').write_text('{"features": []}') + with patch.object(mask, 'SOURCE', source): + with self.assertRaisesRegex(ValueError, 'Source hash mismatch'): + mask.mask_pixels() + + +if __name__ == '__main__': + unittest.main() diff --git a/tests/python/test_release_artifact.py b/tests/python/test_release_artifact.py index 5fbda153..28d54179 100644 --- a/tests/python/test_release_artifact.py +++ b/tests/python/test_release_artifact.py @@ -69,6 +69,7 @@ def test_rendering_dependency_changes_invalidate_science_fingerprint(self): "surfaceReflection.js", "surfaceReflectionShaders.js", "terrainResources.js", "shaderPrograms.js", "referenceDemand.js", "hdrPresentation.js", "hdrPresentationShaders.js", + "enhancedEarth.js", "earthOceanMask.js", ) actual_web = Path(__file__).resolve().parents[2] / "apps/web/js" folder = self.source / "js" diff --git a/tests/web/enhancedEarth.test.mjs b/tests/web/enhancedEarth.test.mjs new file mode 100644 index 00000000..70d719b8 --- /dev/null +++ b/tests/web/enhancedEarth.test.mjs @@ -0,0 +1,166 @@ +import assert from 'node:assert/strict'; +import test from 'node:test'; +import * as shaders from '../../apps/web/js/orreryShaders.js'; +import {geometryInterpreter} from './fixtures/glslFloat32Geometry.mjs'; +import {orreryHarness} from './helpers/orreryHarness.mjs'; +import {appearanceReference} from '../../apps/web/js/planetAppearance.js'; +import {advanceEarthCloudPhase,oceanMaskPixels} from '../../apps/web/js/enhancedEarth.js'; +import {OCEAN_MASK_WIDTH,OCEAN_MASK_HEIGHT,OCEAN_MASK_SHA256} from '../../apps/web/js/earthOceanMask.js'; +import {createHash} from 'node:crypto'; + +const cloudDraws=h=>h.gpuSubmissions.filter(d=>d.kind==='elements'&&d.uniforms.u_mode===3); +async function boot(t,options={}){ + const h=await orreryHarness(t,{controls:true,...options}); + await h.enterOrrery();h.setAnimate(false);h.input('orreryAnchor','Earth','change');await h.settle(); + t.after(()=>h.leaveOrrery());return h; +} +function load(h,role){ + const asset=appearanceReference('Earth',role),img=h.images.find(i=>i.src?.includes(asset.path)); + assert.ok(img,`${role} requested`);[img.width,img.height]=asset.dimensions;img.onload(); +} + +test('enhancement is opt-in and never advances the scientific clock or changes other bodies',async t=>{ + const h=await boot(t);assert.equal(cloudDraws(h).length,0); + const identity=JSON.stringify([h.state.renderUnix,h.state.bodies]); + h.check('orreryEarthEnhanced',true); + assert.equal(h.state.earthEnhanced,true); + assert.equal(JSON.stringify([h.state.renderUnix,h.state.bodies]),identity); + assert.match(h.nodes.orreryEarthLayerStatus.textContent,/illustrative/i); + h.check('orreryEarthEnhanced',false);assert.equal(h.state.earthEnhanced,false); +}); + +test('raised cloud draw shares shadow phase, omits ground clouds and keeps transparent depth state',async t=>{ + const h=await boot(t);load(h,'surface');await h.settle();load(h,'cloud-composite'); + h.gpuSubmissions.length=0;h.check('orreryEarthEnhanced',true); + const cloud=cloudDraws(h).at(-1);assert.ok(cloud,'ready cloud map gets its own draw'); + const ground=h.gpuSubmissions.find(d=>d.kind==='elements'&&d.uniforms.u_earthEnhanced===1&&d.uniforms.u_mode===0); + assert.ok(ground);assert.equal(ground.uniforms.u_earthWeather,0,'no double cloud layer'); + assert.equal(ground.uniforms.u_earthCloudShadow,1); + assert.equal(cloud.uniforms.u_cloudPhase,ground.uniforms.u_cloudPhase); + assert.equal(cloud.uniforms.u_cloudScale,ground.uniforms.u_cloudScale); + const a=ground.uniforms.u_model,b=cloud.uniforms.u_model; + const length=m=>Math.hypot(m[0],m[1],m[2]); + assert.ok(length(b)>length(a));assert.ok(length(b)/length(a)<1.002,'height is small, not a balloon'); + assert.equal(cloud.depthWrites,false);assert.ok(cloud.enabled.has(h.gl.DEPTH_TEST)); + assert.ok(cloud.enabled.has(h.gl.CULL_FACE));assert.deepEqual(cloud.blend,[h.gl.SRC_ALPHA,h.gl.ONE_MINUS_SRC_ALPHA]); + assert.equal(cloud.uniforms.u_earthNight,0);assert.equal(cloud.uniforms.u_earthIce,0); + assert.equal(cloud.textures.get(3),ground.textures.get(3)); +}); + +test('cloud off, missing maps and daily ground-containing swaths cannot lift or cast cloud shadows',async t=>{ + const h=await boot(t);h.check('orreryEarthEnhanced',true); + assert.equal(cloudDraws(h).length,0); + load(h,'surface');await h.settle();load(h,'cloud-composite'); + h.gpuSubmissions.length=0;h.check('orreryEarthWeather',false); + assert.equal(cloudDraws(h).length,0); + assert.ok(h.gpuSubmissions.filter(d=>d.kind==='elements'&&d.uniforms.u_mode===0).every(d=>d.uniforms.u_earthCloudShadow===0)); + h.check('orreryEarthWeather',true);h.gpuSubmissions.length=0; + h.input('orreryEarthCloudSource','daily','change'); + assert.equal(cloudDraws(h).length,0);assert.match(h.nodes.orreryEarthLayerStatus.textContent,/suspended/i); + assert.ok(h.gpuSubmissions.filter(d=>d.kind==='elements'&&d.uniforms.u_mode===0).every(d=>d.uniforms.u_earthEnhanced===0)); +}); + +test('drift advances only with visible animated Earth and survives paused camera redraws',async t=>{ + const h=await boot(t);load(h,'surface');await h.settle();load(h,'cloud-composite');h.check('orreryEarthEnhanced',true); + const initial=cloudDraws(h).at(-1)?.uniforms.u_cloudPhase; + assert.equal(initial,0);h.setAnimate(true);h.frame(100);h.frame(116); + const moved=cloudDraws(h).at(-1).uniforms.u_cloudPhase;assert.ok(moved>0&&moved<0.001); + h.setAnimate(false);h.resize(810,605);h.event('orreryCanvas','keydown',{key:'ArrowLeft'}); + assert.equal(cloudDraws(h).at(-1).uniforms.u_cloudPhase,moved); + h.setWindowReducedMotion(true);h.setAnimate(true);h.frame(132); + assert.equal(cloudDraws(h).at(-1).uniforms.u_cloudPhase,moved); +}); + +test('executed shadow geometry follows the Sun and hits the elevated ellipsoid at grazing angles',()=>{ + const g=geometryInterpreter(shaders.EARTH_CLOUD_GEOMETRY_GLSL||''); + const hit=(p,l,oblate=1)=>g.run('earthCloudHit',[p,l,oblate,1.01]).value; + const near=(a,b)=>assert.ok(Math.abs(a-b)<2e-6,`${a} != ${b}`); + const overhead=hit([1,0,0],[1,0,0]);near(overhead[0],1.01);near(overhead[1],0); + const east=hit([1,0,0],[0,1,0]),west=hit([1,0,0],[0,-1,0]); + near(east[1],Math.sqrt(.0201));near(east[1],-west[1]);near(Math.hypot(...east),1.01); + const polar=hit([0,0,1],[1,0,0],.997);near(Math.hypot(...polar),1.01); +}); + +test('executed ocean grading preserves masked land, bright ice and neutral colors',()=>{ + const g=geometryInterpreter(shaders.EARTH_OCEAN_GLSL||''); + const grade=(c,m)=>g.run('enhancedOceanColor',[c,m]).value; + for(const [c,m] of [[[.01,.04,.12],0],[[.8,.9,1],1],[[.1,.1,.1],1],[[.3,.2,.1],1]]) + assert.deepEqual(grade(c,m),c.map(Math.fround)); + const c=grade([.01,.04,.12],1),want=[.00873378,.02193378,.05713378]; + c.forEach((v,i)=>assert.ok(Math.abs(v-want[i])<1e-7)); +}); + +test('phase is continuous through wrapping, frame subdivision, rate limiting and invalid steps',()=>{ + const step=(phase,dt,sim,enabled=true)=>advanceEarthCloudPhase(phase,dt,sim,24,enabled); + assert.ok(Math.abs(step(.999,1,86400)-.001)<1e-12,'capped drift wraps smoothly'); + assert.ok(Math.abs(step(0,1,3600)-.00125)<1e-12,'drift is relative to displayed rotation'); + assert.ok(Math.abs(step(step(0,.5,1800),.5,1800)-step(0,1,3600))<1e-12); + for(const [dt,sim,enabled] of [[1,3600,false],[0,3600,true],[-1,3600,true],[NaN,3600,true],[1,NaN,true]]) + assert.equal(step(.3,dt,sim,enabled),.3); + assert.ok(Math.abs(step(.001,1,-86400)-.999)<1e-12); +}); + +test('mask bytes match their generated hash and preserve land/polar ice while admitting open oceans',()=>{ + const pixels=oceanMaskPixels();assert.equal(pixels.length,OCEAN_MASK_WIDTH*OCEAN_MASK_HEIGHT); + assert.equal(createHash('sha256').update(pixels).digest('hex'),OCEAN_MASK_SHA256); + const at=(lon,lat)=>pixels[Math.min(OCEAN_MASK_HEIGHT-1,Math.floor((90-lat)/180*OCEAN_MASK_HEIGHT))*OCEAN_MASK_WIDTH + +Math.floor((((lon+180)%360+360)%360)/360*OCEAN_MASK_WIDTH)]; + for(const [lon,lat] of [[20,10],[-100,40],[100,40],[-45,75],[0,-89],[140,-25]])assert.equal(at(lon,lat),0); + for(const [lon,lat] of [[-140,0],[-30,0],[80,-30],[179,0],[-179,0]])assert.equal(at(lon,lat),255); +}); + +test('physical ground program gets enhancement uniforms while cloud rendering stays in its own disclosed pass',async t=>{ + const h=await boot(t,{incidentField:async()=>({values:new Float32Array(4*257*195),width:257,height:195, + domain:{minHeightKm:0,maxHeightKm:16,quadratic:true}})}); + load(h,'surface');await h.settle();load(h,'cloud-composite'); + h.gpuSubmissions.length=0;h.check('orreryEarthEnhanced',true); + const ground=h.gpuSubmissions.find(d=>d.uniforms.u_scatteringReady===1&&d.uniforms.u_earthEnhanced===1); + assert.ok(ground,'physical atmosphere and enhanced ground coexist'); + assert.equal(ground.uniforms.u_earthCloudShadow,1);assert.equal(ground.uniforms.u_earthWeather,0); + const cloud=cloudDraws(h).at(-1);assert.ok(cloud);assert.equal(cloud.uniforms.u_atmosphereEnabled,0); + assert.equal(cloud.uniforms.u_cloudPhase,ground.uniforms.u_cloudPhase); + assert.deepEqual(h.errors,[]); +}); + +test('turning off, hiding, leaving and restoring cannot advance clouds or retain dead mask textures',async t=>{ + const h=await boot(t);load(h,'surface');await h.settle();load(h,'cloud-composite');h.check('orreryEarthEnhanced',true); + h.setAnimate(true);h.frame(100);h.setAnimate(false); + const phase=h.state.earthCloudPhase; + const mask=h.gpuSubmissions.find(d=>d.uniforms.u_earthEnhanced===1).textures.get(11); + h.setHidden(true);h.setHidden(false);assert.equal(h.state.earthCloudPhase,phase); + h.leaveOrrery();await h.enterOrrery();assert.equal(h.state.earthCloudPhase,phase); + h.event('orreryCanvas','webglcontextlost');assert.ok(h.deletedTextures.includes(mask)); + h.event('orreryCanvas','webglcontextrestored');await h.settle(); + assert.equal(h.state.earthCloudPhase,phase);assert.equal(h.state.earthEnhanced,true); + h.gpuSubmissions.length=0;h.check('orreryEarthEnhanced',false); + assert.equal(cloudDraws(h).length,0); + assert.ok(h.gpuSubmissions.filter(d=>d.kind==='elements'&&d.uniforms.u_mode===0).every(d=>d.uniforms.u_earthEnhanced===0)); +}); + +test('animated suspension cancels frames and resumes without catching up hidden elapsed time',async t=>{ + const h=await boot(t);load(h,'surface');await h.settle();load(h,'cloud-composite');h.check('orreryEarthEnhanced',true); + h.setAnimate(true);h.frame(100);const phase=h.state.earthCloudPhase; + h.setHidden(true);assert.equal(h.frames.size,0,'hidden animated view cancels its queued tick'); + h.resize(805,602);assert.equal(h.state.earthCloudPhase,phase); + h.setHidden(false);h.frame(100000); + assert.ok(h.state.earthCloudPhase>phase&&h.state.earthCloudPhase-phase<.0001,'resume takes a single small step'); + const resumed=h.state.earthCloudPhase;h.leaveOrrery();assert.equal(h.frames.size,0); + h.resize(807,604);assert.equal(h.state.earthCloudPhase,resumed,'inactive redraw cannot move clouds'); +}); + +test('mask upload failure leaves a usable cloud layer and can be retried explicitly',async t=>{ + const h=await boot(t);load(h,'surface');await h.settle();load(h,'cloud-composite'); + h.setTextureUploadError(pixels=>ArrayBuffer.isView(pixels)&&pixels.byteLength===512*256?h.gl.OUT_OF_MEMORY:0); + h.check('orreryEarthEnhanced',true); + assert.equal(h.state.earthMaskStatus,'unavailable');assert.ok(cloudDraws(h).length); + assert.match(h.nodes.orreryEarthLayerStatus.textContent,/Ocean grading unavailable/); + const uploads=h.textureUploads.length;h.resize(810,605);assert.equal(h.textureUploads.length,uploads,'no automatic failure retry loop'); + h.setTextureUploadError(0);h.check('orreryEarthEnhanced',false);h.check('orreryEarthEnhanced',true); + assert.equal(h.state.earthMaskStatus,'ready'); +}); + +test('scientific sea-ice colors suspend enhancement instead of being dimmed by raised clouds',async t=>{ + const h=await boot(t);load(h,'surface');await h.settle();load(h,'cloud-composite');h.check('orreryEarthEnhanced',true); + h.gpuSubmissions.length=0;h.check('orreryEarthIce',true); + assert.equal(cloudDraws(h).length,0);assert.match(h.nodes.orreryEarthLayerStatus.textContent,/suspended.*sea.ice/i); +}); diff --git a/tests/web/helpers/orreryHarness.mjs b/tests/web/helpers/orreryHarness.mjs index d48c5083..b864ca87 100644 --- a/tests/web/helpers/orreryHarness.mjs +++ b/tests/web/helpers/orreryHarness.mjs @@ -206,6 +206,7 @@ export async function orreryHarness(t, options = {}) { } for (const id of ["Textures", "EarthNight", "EarthWeather"]) nodes[`orrery${id}`].checked = true; nodes.orreryEarthIce.checked = false; + nodes.orreryEarthEnhanced = node({ checked: false }); nodes.orreryVenusRadar = node({ checked: false }); nodes.orreryEarthCloudSource = node({ value: "composite" }, "select"); nodes.orrerySpeedUnit.value = "1"; diff --git a/tests/web/illustrativeHaze.test.mjs b/tests/web/illustrativeHaze.test.mjs index e333c073..fda7f5ad 100644 --- a/tests/web/illustrativeHaze.test.mjs +++ b/tests/web/illustrativeHaze.test.mjs @@ -111,7 +111,7 @@ test('aerosol path radiance converges toward the limb instead of diverging', () test('only the illustrative program carries the haze, and it replaces the rim rather than stacking', () => { for (const source of [shaders.SPHERE_FS, shaders.BASE_SPHERE_FS]) { assert.match(source, /uniform vec3 u_hazeRayleighTau;/); - assert.ok(source.includes('hazeOverSurface(surface,N,V,normalize(u_light),sunVis)')); + assert.ok(source.includes('hazeOverSurface(surface,N,V,normalize(u_light),hazeSunVis)')); assert.ok(source.includes('displayLimb=vec3(0);'), 'a haze body drops the illustrative rim'); assert.ok(source.includes('vec3 displayLimb=u_atmo*fres*u_atmoStr'), 'other bodies keep the rim recipe'); } diff --git a/tools/build_web.py b/tools/build_web.py index 849fea8c..6b81f39e 100644 --- a/tools/build_web.py +++ b/tools/build_web.py @@ -55,7 +55,7 @@ def validate_visual_source(source_root: Path) -> frozenset[str]: "solarAppearance.js", "solarAppearanceManifest.js", "solarVolumeShaders.js", "atmosphereOptics.js", "atmosphereShaders.js", "atmosphereIncident.js", "atmosphereIncidentManifest.js", "atmosphereColumnField.js", "atmosphereColumnManifest.js", "atmosphereScattering.js", "scatteringTargets.js", "planetPhenomena.js", "planetPhenomenaManifest.js", "solarAssetLoader.js", "physicalRendering.js", - "illustrativeHaze.js", + "illustrativeHaze.js", "enhancedEarth.js", "earthOceanMask.js", # render.js decides how an observed solar frame reaches the canvas: drawObservedBase() # chooses between a registered photospheric disk and a whole browse frame, and owns the # clip and limb treatment that go with each. That is observation rendering, so its hash diff --git a/tools/enhanced_earth_probe.mjs b/tools/enhanced_earth_probe.mjs new file mode 100644 index 00000000..9f2c23e0 --- /dev/null +++ b/tools/enhanced_earth_probe.mjs @@ -0,0 +1,14 @@ +// Input export for the optional offscreen GLES diagnostic. Run through render_enhanced_earth_probe.py. +import fs from 'node:fs'; +import * as sh from '../apps/web/js/orreryShaders.js'; +import {buildSphere,lookAt,perspective,mul,scaleM,norm} from '../apps/web/js/orreryMath.js'; +import {BODY} from '../apps/web/js/bodyData.js'; +import {hazeUniformValues} from '../apps/web/js/illustrativeHaze.js'; +import {getAtmosphereProfile} from '../apps/web/js/atmosphereOptics.js'; +import {oceanMaskPixels,EARTH_CLOUD_HEIGHT_KM} from '../apps/web/js/enhancedEarth.js'; +const eye=[2.3,-2.3,1],oblate=BODY.Earth.polarKm/BODY.Earth.radiusKm,cloudScale=1+EARTH_CLOUD_HEIGHT_KM/BODY.Earth.radiusKm; +const vp=mul(perspective(42*Math.PI/180,1,.01,100),lookAt(eye,[0,0,0],[0,0,1])); +const model=scaleM([1,1,oblate]),cloudModel=scaleM([cloudScale,cloudScale,cloudScale*oblate]),mesh=buildSphere(48,96); +const output={programs:{base:[sh.BASE_SPHERE_VS,sh.BASE_SPHERE_FS],physical:[sh.SCATTERING_SPHERE_VS,sh.SCATTERING_SPHERE_FS]},mesh:{pos:[...mesh.pos],idx:[...mesh.idx]},mask:[...oceanMaskPixels()],cloudModel,cloudMvp:mul(vp,cloudModel),uniforms:{ + u_mvp:mul(vp,model),u_model:model,u_nmat:[1,0,0,0,1,0,0,0,1/oblate],u_cam:eye,u_light:norm([1,-.15,.2]),u_lightObj:norm([1,-.15,.2]),u_oblate:oblate,u_bodyRadiusKm:BODY.Earth.radiusKm,u_map:[.5,1,2,0],u_mapLat:[-Math.PI/2,Math.PI/2,-Math.PI/2,Math.PI/2],u_mapWindow:[1,1,0,0],u_mapNoData:0,u_useTex:1,u_texMode:3,u_tex:0,u_textureLinear:1,u_weatherTex:3,u_nightTex:2,u_iceTex:4,u_oceanMask:11,u_ringTex:1,u_terrainHeight:5,u_atmosphereIncidentField:6,u_atmosphereColumnField:7,u_atmosphereOzoneField:10,u_style:-1,u_mode:0,u_earthWeather:1,u_earthNight:0,u_earthIce:0,u_earthEnhanced:0,u_earthCloudShadow:0,u_cloudScale:cloudScale,u_cloudPhase:0,u_linearOutput:0,u_atmosphereEnabled:0,u_terrainShadowEnabled:0,u_atmo:[.35,.6,1],u_base:[.2,.2,.2],...hazeUniformValues(getAtmosphereProfile('Earth'))}}; +fs.writeFileSync(process.argv[2],JSON.stringify(output)); diff --git a/tools/prepare_earth_ocean_mask.py b/tools/prepare_earth_ocean_mask.py new file mode 100644 index 00000000..01e38a21 --- /dev/null +++ b/tools/prepare_earth_ocean_mask.py @@ -0,0 +1,116 @@ +#!/usr/bin/env python3 +"""Offline, conservative offshore display mask; never a scientific ocean product. + +Uses committed public-domain Natural Earth 1:110m land and glaciated-area rings. +Interior holes remain protected (inland water is not an ocean). A two-pixel +offshore margin and the shader's dark-blue gate protect the coarse coastline. +Run with --check to verify deterministic regeneration. +""" +import argparse +import hashlib +import json +import math +from pathlib import Path + +ROOT = Path(__file__).resolve().parent.parent +SOURCE = ROOT / "tools/ephemeris-data/geography" +OUTPUT = ROOT / "apps/web/js/earthOceanMask.js" +WIDTH, HEIGHT = 512, 256 +INPUTS = { + "ne_110m_land.geojson": "9e0729ee253ca7d7a5c4ae9395fb1902264c5377c52e224d13dd85010e2835d9", + "ne_110m_glaciated_areas.geojson": "e61e3f45e22f087f861ac2fda6258fc15c849a216d74c27ccf0164eeafbd950a", +} + + +def unwrapped(ring): + lon = (ring[0][0] + 180) % 360 - 180 + points = [((lon + 180) * WIDTH / 360, (90 - ring[0][1]) * HEIGHT / 180)] + for a, b in zip(ring, ring[1:]): + delta = b[0] - a[0] + if delta > 180: + delta -= 360 + elif delta < -180: + delta += 360 + lon += delta + points.append(((lon + 180) * WIDTH / 360, (90 - b[1]) * HEIGHT / 180)) + return points + + +def mask_pixels(): + # Integer bit rows keep rasterization/dilation deterministic without image libraries. + rows = [0] * HEIGHT + for name, digest in INPUTS.items(): + data = (SOURCE / name).read_bytes() + if hashlib.sha256(data).hexdigest() != digest: + raise ValueError(f"Source hash mismatch: {name}") + for feature in json.loads(data)["features"]: + geometry = feature["geometry"] + polygons = [geometry["coordinates"]] if geometry["type"] == "Polygon" else geometry["coordinates"] + for polygon in polygons: + ring = polygon[0] + points = unwrapped(ring) + if abs(points[-1][0] - points[0][0]) > WIDTH * .99: + # Close polar rings at their westernmost vertex, through the pole. + start = min(range(len(points) - 1), key=lambda i: points[i][0]) + ring = ring[start:-1] + ring[:start] + [ring[start]] + points = unwrapped(ring) + pole = HEIGHT if sum(p[1] for p in ring) < 0 else 0 + points += [(points[-1][0], pole), (points[0][0], pole)] + for offset in (-WIDTH, 0, WIDTH): + shifted = [(x + offset, y) for x, y in points] + edges = list(zip(shifted, shifted[1:] + shifted[:1])) + for y in range(max(0, math.floor(min(p[1] for p in shifted))), + min(HEIGHT, math.ceil(max(p[1] for p in shifted)))): + scan = y + .5 + hits = sorted(a[0] + (scan - a[1]) * (b[0] - a[0]) / (b[1] - a[1]) + for a, b in edges if (a[1] > scan) != (b[1] > scan)) + for left, right in zip(hits[::2], hits[1::2]): + lo, hi = max(0, math.ceil(left - .5)), min(WIDTH, math.ceil(right - .5)) + if hi > lo: + rows[y] |= ((1 << (hi - lo)) - 1) << lo + # Two-pixel dilation, wrapping longitude and clamping the poles. + full = (1 << WIDTH) - 1 + protected = [] + for y in range(HEIGHT): + row = 0 + for source in rows[max(0, y - 2):min(HEIGHT, y + 3)]: + row |= source + expanded = row + for shift in (1, 2): + expanded |= ((row << shift) | (row >> (WIDTH - shift))) & full + expanded |= ((row >> shift) | (row << (WIDTH - shift))) & full + protected.extend(0 if expanded & (1 << x) else 255 for x in range(WIDTH)) + return bytes(protected) + + +def generate(): + pixels = mask_pixels() + runs, previous, length = [], 0, 0 + for value in pixels: + if value != previous: + runs.append(length) + previous, length = value, 0 + length += 1 + runs.append(length) + return ( + "// GENERATED by tools/prepare_earth_ocean_mask.py. Public-domain Natural Earth.\n" + "// Conservative offshore display mask, not a qualified coastline or reflectance map.\n" + f"export const OCEAN_MASK_WIDTH={WIDTH},OCEAN_MASK_HEIGHT={HEIGHT};\n" + f"export const OCEAN_MASK_SOURCES={json.dumps(INPUTS, separators=(',', ':'))};\n" + f"export const OCEAN_MASK_SHA256='{hashlib.sha256(pixels).hexdigest()}';\n" + f"export const OCEAN_MASK_RUNS={json.dumps(runs, separators=(',', ':'))};\n" + ) + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--check", action="store_true") + args = parser.parse_args() + content = generate() + if args.check: + if not OUTPUT.exists() or OUTPUT.read_text() != content: + raise SystemExit("Earth ocean mask differs; regenerate it") + print("OK: Earth ocean mask reproduces exactly") + else: + OUTPUT.write_text(content) + print(f"Wrote {OUTPUT.relative_to(ROOT)} ({len(content)} bytes)") diff --git a/tools/render_enhanced_earth_probe.py b/tools/render_enhanced_earth_probe.py new file mode 100644 index 00000000..ca4861a8 --- /dev/null +++ b/tools/render_enhanced_earth_probe.py @@ -0,0 +1,126 @@ +"""Optional Linux EGL/Mesa diagnostic using production shaders, not browser qualification. + +Requires system libEGL, Node, NumPy and Pillow. No network or browser automation. +Outputs controlled comparisons and shader/source hashes to --output (default: docs/validation/enhanced-earth). +""" +import argparse +import ctypes as c +import hashlib +import json +import subprocess +import tempfile +from pathlib import Path +import numpy as np +from PIL import Image, ImageDraw, ImageFont +ROOT=Path(__file__).resolve().parent.parent +parser=argparse.ArgumentParser(description=__doc__) +parser.add_argument('--output',type=Path,default=ROOT/'docs/validation/enhanced-earth') +args=parser.parse_args() +OUT=args.output +OUT.mkdir(parents=True,exist_ok=True) +with tempfile.TemporaryDirectory() as tmp: + data=Path(tmp)/'probe.json' + subprocess.run(['node',str(ROOT/'tools/enhanced_earth_probe.mjs'),str(data)],check=True) + D=json.loads(data.read_text()) +W=768 +E=c.CDLL('libEGL.so.1');E.eglGetProcAddress.argtypes=[c.c_char_p];E.eglGetProcAddress.restype=c.c_void_p + +def egl(name,result,*types): + f=getattr(E,name);f.restype=result;f.argtypes=types;return f + +def gl(name,result,*types): + addr=E.eglGetProcAddress(name.encode());assert addr,name + return c.CFUNCTYPE(result,*types)(addr) + +I,U,P,F=c.c_int,c.c_uint,c.c_void_p,c.c_float +platform=c.CFUNCTYPE(P,U,P,c.POINTER(I))(E.eglGetProcAddress(b'eglGetPlatformDisplayEXT')) +d=platform(0x31DD,None,None);ma,mi=I(),I();assert egl('eglInitialize',U,P,c.POINTER(I),c.POINTER(I))(d,c.byref(ma),c.byref(mi)) +assert egl('eglBindAPI',U,U)(0x30A0) +attrs=(I*15)(0x3033,1,0x3040,0x40,0x3024,8,0x3023,8,0x3022,8,0x3021,8,0x3025,24,0x3038) +cfg=P();n=I();assert egl('eglChooseConfig',U,P,c.POINTER(I),c.POINTER(P),I,c.POINTER(I))(d,attrs,c.byref(cfg),1,c.byref(n)) and n.value +surface=egl('eglCreatePbufferSurface',P,P,P,c.POINTER(I))(d,cfg,(I*5)(0x3057,W,0x3056,W,0x3038)) +ctx=egl('eglCreateContext',P,P,P,P,c.POINTER(I))(d,cfg,None,(I*3)(0x3098,3,0x3038));assert ctx +assert egl('eglMakeCurrent',U,P,P,P,P)(d,surface,surface,ctx) +renderer=gl('glGetString',c.c_char_p,U)(0x1F01).decode();version=gl('glGetString',c.c_char_p,U)(0x1F02).decode();print(renderer,version,flush=True) +create=gl('glCreateShader',U,U);source=gl('glShaderSource',None,U,I,c.POINTER(c.c_char_p),P);compile_=gl('glCompileShader',None,U);getshader=gl('glGetShaderiv',None,U,U,c.POINTER(I));slog=gl('glGetShaderInfoLog',None,U,I,P,c.c_char_p) +cp=gl('glCreateProgram',U);attach=gl('glAttachShader',None,U,U);link=gl('glLinkProgram',None,U);getprog=gl('glGetProgramiv',None,U,U,c.POINTER(I));plog=gl('glGetProgramInfoLog',None,U,I,P,c.c_char_p) +programs={} +for name,shaders in D['programs'].items(): + p=cp() + for kind,text in zip((0x8B31,0x8B30),shaders): + s=create(kind);raw=c.c_char_p(text.encode());source(s,1,c.byref(raw),None);compile_(s);ok=I();getshader(s,0x8B81,c.byref(ok)) + if not ok.value: + msg=c.create_string_buffer(50000);slog(s,len(msg),None,msg);raise RuntimeError(msg.value.decode()) + attach(p,s) + link(p);ok=I();getprog(p,0x8B82,c.byref(ok)) + if not ok.value: + msg=c.create_string_buffer(50000);plog(p,len(msg),None,msg);raise RuntimeError(msg.value.decode()) + programs[name]=p;print('compiled and linked',name,flush=True) +p=programs['base'];gl('glUseProgram',None,U)(p) +getloc=gl('glGetUniformLocation',I,U,c.c_char_p) +ints={'u_mode','u_style','u_useTex','u_texMode','u_mapNoData','u_textureLinear','u_tex','u_weatherTex','u_nightTex','u_iceTex','u_oceanMask','u_ringTex','u_terrainHeight','u_atmosphereIncidentField','u_atmosphereColumnField','u_atmosphereOzoneField','u_earthWeather','u_earthNight','u_earthIce','u_earthEnhanced','u_earthCloudShadow','u_linearOutput','u_atmosphereEnabled','u_terrainShadowEnabled'} +def uniform(name,value): + loc=getloc(p,name.encode()) + if loc<0:return + if isinstance(value,list): + arr=(F*len(value))(*value) + if len(value) in (9,16):gl('glUniformMatrix'+('3' if len(value)==9 else '4')+'fv',None,I,I,U,c.POINTER(F))(loc,1,0,arr) + else:gl(f'glUniform{len(value)}fv',None,I,I,c.POINTER(F))(loc,1,arr) + elif name in ints:gl('glUniform1i',None,I,I)(loc,value) + else:gl('glUniform1f',None,I,F)(loc,value) +for name,value in D['uniforms'].items():uniform(name,value) +# All actual sampler2D uniforms get distinct, valid texture bindings. +gen=gl('glGenTextures',None,I,c.POINTER(U));bind=gl('glBindTexture',None,U,U);active=gl('glActiveTexture',None,U);param=gl('glTexParameteri',None,U,U,I);teximage=gl('glTexImage2D',None,U,I,I,I,I,I,U,U,P);mip=gl('glGenerateMipmap',None,U) +def texture(unit,array,internal=0x8058,fmt=0x1908): + tex=U();gen(1,c.byref(tex));active(0x84C0+unit);bind(0x0DE1,tex.value) + a=np.ascontiguousarray(array,dtype=np.uint8);h,w=a.shape[:2];teximage(0x0DE1,0,internal,w,h,0,fmt,0x1401,a.ctypes.data) + param(0x0DE1,0x2801,0x2703);param(0x0DE1,0x2800,0x2601);param(0x0DE1,0x2802,0x2901);param(0x0DE1,0x2803,0x812F);mip(0x0DE1) +for unit in range(12):texture(unit,np.full((1,1,4),255,dtype=np.uint8)) +texture(0,np.array(Image.open(ROOT/'apps/web/textures/reference/earth-land-2004.jpg').convert('RGBA')),0x8C43) +cloud=np.array(Image.open(ROOT/'apps/web/textures/reference/earth-blue-marble-2002-cloud-layer.png').convert('RGBA')) +cloud[:,:,:3]=((cloud[:,:,:3].astype(np.uint16)*cloud[:,:,3,None]+127)//255).astype(np.uint8) +texture(3,cloud) +texture(11,np.array(D['mask'],dtype=np.uint8).reshape(256,512),0x8229,0x1903) +genbuf=gl('glGenBuffers',None,I,c.POINTER(U));bindbuf=gl('glBindBuffer',None,U,U);bufdata=gl('glBufferData',None,U,c.c_ssize_t,P,U) +a=np.array(D['mesh']['pos'],dtype=np.float32);ind=np.array(D['mesh']['idx'],dtype=np.uint16) +for target,array in [(0x8892,a),(0x8893,ind)]: + b=U();genbuf(1,c.byref(b));bindbuf(target,b);bufdata(target,array.nbytes,array.ctypes.data,0x88E4) +for loc in (0,1): + gl('glEnableVertexAttribArray',None,U)(loc);gl('glVertexAttribPointer',None,U,I,U,U,I,P)(loc,3,0x1406,0,12,None) +enable=gl('glEnable',None,U);disable=gl('glDisable',None,U);depth=gl('glDepthMask',None,U);blend=gl('glBlendFunc',None,U,U) +gl('glViewport',None,I,I,I,I)(0,0,W,W);enable(0x0B71);enable(0x0B44);gl('glCullFace',None,U)(0x0405);enable(0x0BE2);blend(0x0302,0x0303) +# SOL sphere triangles use the same winding and back-face culling as production. +draw=gl('glDrawElements',None,U,I,U,P);read=gl('glReadPixels',None,I,I,I,I,U,U,P) +geterror=gl('glGetError',U) +assert geterror()==0,'setup GL error' +def render(enhanced,phase=0,shadows=True): + gl('glClearColor',None,F,F,F,F)(.008,.01,.017,1);depth(1);gl('glClear',None,U)(0x4000|0x0100) + uniform('u_model',D['uniforms']['u_model']);uniform('u_mvp',D['uniforms']['u_mvp']);uniform('u_mode',0) + uniform('u_cloudPhase',phase);uniform('u_earthWeather',int(not enhanced));uniform('u_earthEnhanced',int(enhanced));uniform('u_earthCloudShadow',int(enhanced and shadows)) + draw(4,len(ind),0x1403,None) + if enhanced: + uniform('u_model',D['cloudModel']);uniform('u_mvp',D['cloudMvp']);uniform('u_mode',3);depth(0);draw(4,len(ind),0x1403,None);depth(1) + gl('glFinish',None)();pixels=np.empty((W,W,4),dtype=np.uint8);read(0,0,W,W,0x1908,0x1401,pixels.ctypes.data) + assert geterror()==0,'render GL error' + return Image.fromarray(pixels[::-1,:,:3]) +original=render(False);enhanced=render(True);drifted=render(True,.02);unshadowed=render(True,shadows=False) +canvas=Image.new('RGB',(W*2,W+88),(8,10,16));canvas.paste(original,(0,70));canvas.paste(enhanced,(W,70));pd=ImageDraw.Draw(canvas) +font='/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf';f=ImageFont.truetype(font,22);small=ImageFont.truetype(font,14) +pd.text((25,12),'Original Earth',font=f,fill='white');pd.text((W+25,12),'Enhanced Earth',font=f,fill='white') +pd.text((25,44),'Same NASA maps, camera and Sun direction',font=small,fill='#adb6c4');pd.text((W+25,44),'Darker oceans · 8 km cloud shell · Sun-aligned shadows',font=small,fill='#adb6c4') +pd.text((25,W+64),'Offscreen OpenGL ES software probe · production base shaders / illustrative haze · not a browser qualification',font=small,fill='#adb6c4') +canvas.save(OUT/'comparison.jpg',quality=92) +arrays=[np.array(im,dtype=np.int16) for im in (original,enhanced,drifted,unshadowed)] +# A black ground has no reflected direct light to shadow. Cloud shadows must +# therefore leave its haze contribution unchanged (both passes use identical clouds). +black=np.zeros((1,1,4),dtype=np.uint8);black[:,:,3]=255;texture(0,black,0x8C43) +haze_shadow=np.array(render(True,shadows=True));haze_clear=np.array(render(True,shadows=False)) +assert np.array_equal(haze_shadow,haze_clear),'cloud shadows incorrectly attenuate atmospheric haze' +assert np.any(arrays[0]!=arrays[1]),'enhancement has no visible effect' +assert np.any(arrays[1]!=arrays[2]),'cloud phase has no visible effect' +assert np.any(arrays[1]!=arrays[3]),'cloud shadows have no visible effect' +result={'renderer':renderer,'version':version,'shader_sha256':{name:[hashlib.sha256(stage.encode()).hexdigest() for stage in stages] for name,stages in D['programs'].items()},'programs_compiled':list(programs),'width':W,'height':W, + 'changed_pixels':int(np.any(arrays[0]!=arrays[1],axis=2).sum()),'drift_changed_pixels':int(np.any(arrays[1]!=arrays[2],axis=2).sum()),'shadow_changed_pixels':int(np.any(arrays[1]!=arrays[3],axis=2).sum()), + 'scope':'Controlled offscreen OpenGL ES software rendering of production shaders with original NASA maps; base haze path, no browser/native-device qualification.'} +result['source_sha256']={str(path.relative_to(ROOT)):hashlib.sha256(path.read_bytes()).hexdigest() for path in [ROOT/'apps/web/textures/reference/earth-land-2004.jpg',ROOT/'apps/web/textures/reference/earth-blue-marble-2002-cloud-layer.png',ROOT/'apps/web/js/earthOceanMask.js']} +(OUT/'gl-probe.json').write_text(json.dumps(result,indent=2)+'\n');print(json.dumps(result),flush=True) From 0cf75a30b90c283860158f63091ecdbad9548322 Mon Sep 17 00:00:00 2001 From: Protonmatter <102541048+Protonmatter@users.noreply.github.com> Date: Thu, 24 Sep 2026 02:25:32 +0000 Subject: [PATCH 2/2] Keep night lights and one atmosphere on Enhanced Earth Night-side cloud coverage falls off once the shell is unlit, and close-up clouds leave path radiance to the physical atmosphere shell. Co-authored-by: Protonmatter --- apps/web/js/enhancedEarth.js | 9 +++++++++ apps/web/js/orrery.js | 7 ++++--- apps/web/js/orreryShaders.js | 10 ++++++---- docs/rfcs/0008-enhanced-earth.md | 10 ++++++---- docs/validation/enhanced-earth/README.md | 6 ++++-- tests/web/enhancedEarth.test.mjs | 11 +++++++++++ tests/web/fixtures/glslFloat32Geometry.mjs | 4 ++++ 7 files changed, 44 insertions(+), 13 deletions(-) diff --git a/apps/web/js/enhancedEarth.js b/apps/web/js/enhancedEarth.js index 7b594159..d1252f4b 100644 --- a/apps/web/js/enhancedEarth.js +++ b/apps/web/js/enhancedEarth.js @@ -55,6 +55,15 @@ vec3 earthCloudHit(vec3 p,vec3 light,float oblate,float shell){ } `; +// 0 on the night side, and 1 only after the cloud is actually lit. The 0.05 +// start keeps a dark twilight veil from covering city lights while cloud RGB +// is still the 0.001 night floor. +export const EARTH_CLOUD_COVER_GLSL=` +float earthCloudCover(float sun){ + return smoothstep(0.05, 0.22, max(sun, 0.0)); +} +`; + // The mask excludes coarse land/ice/coastal margins. Dark-blue gating additionally // protects bright ice, land-like colors and islands omitted by the coarse vectors. export const EARTH_OCEAN_GLSL=` diff --git a/apps/web/js/orrery.js b/apps/web/js/orrery.js index 62cafed7..02b644bb 100644 --- a/apps/web/js/orrery.js +++ b/apps/web/js/orrery.js @@ -1959,7 +1959,7 @@ function bindEarthEnhancement(enhancement,locations) { if(enhancement.clouds)gl.uniform1i(locations.u_earthWeather,0); } -function drawEarthClouds(enhancement,pos,rot,rEq,rPol,vp,eye,light,normals,reference) { +function drawEarthClouds(enhancement,pos,rot,rEq,rPol,vp,eye,light,normals,reference,shell) { const u=P.sphereU,model=mul(translate(pos),mul(rot,scaleM([rEq*enhancement.scale,rEq*enhancement.scale,rPol*enhancement.scale]))); gl.useProgram(P.sphere);setAtmosphereUniforms(gl,u,null); gl.uniform1i(u.u_linearOutput,linearFrame?1:0); @@ -1978,7 +1978,7 @@ function drawEarthClouds(enhancement,pos,rot,rEq,rPol,vp,eye,light,normals,refer gl.uniform4fv(u.u_mapWindow,new Float32Array(uniforms.window)); gl.activeTexture(gl.TEXTURE0+3);gl.bindTexture(gl.TEXTURE_2D,enhancement.clouds.tex);gl.uniform1i(u.u_weatherTex,3); gl.activeTexture(gl.TEXTURE0); - setHazeUniforms(gl,u,getAtmosphereProfile('Earth')); + setHazeUniforms(gl,u,shell?null:getAtmosphereProfile('Earth')); bindBodyMesh();gl.enable(gl.CULL_FACE);gl.cullFace(gl.BACK);gl.depthMask(false); gl.blendFunc(gl.SRC_ALPHA,gl.ONE_MINUS_SRC_ALPHA); gl.drawElements(gl.TRIANGLES,sphere.count,gl.UNSIGNED_SHORT,0); @@ -2151,7 +2151,8 @@ function drawBody(b, vp, eye) { gl.drawElements(gl.TRIANGLES,mesh.count,mesh.indexType||gl.UNSIGNED_SHORT,0); gl.disable(gl.CULL_FACE); - if(earthEnhancement.clouds)queueTransparent(pos,eye,()=>drawEarthClouds(earthEnhancement,pos,rot,rEq,rPol,vp,eye,light,normals,reference)); + const atmosphereShell=!!profile; + if(earthEnhancement.clouds)queueTransparent(pos,eye,()=>drawEarthClouds(earthEnhancement,pos,rot,rEq,rPol,vp,eye,light,normals,reference,atmosphereShell)); // atmosphere limb halo (additive shell, slightly larger, no depth write) if (atmoStr > 0 && b.name !== "Sun" && b.name !== "Earth" && !profile) { diff --git a/apps/web/js/orreryShaders.js b/apps/web/js/orreryShaders.js index d66ded19..77056a48 100644 --- a/apps/web/js/orreryShaders.js +++ b/apps/web/js/orreryShaders.js @@ -8,8 +8,8 @@ import { INCIDENT_FIELD_GLSL } from './atmosphereIncident.js'; import { TERRAIN_SHADOW_GLSL } from './terrainShadowShaders.js'; import { DISPLAY_COMPOSITION_GLSL } from './materialColor.js'; import { RING_TRANSPORT_GLSL } from './ringTransportShaders.js'; -import {EARTH_CLOUD_GEOMETRY_GLSL,EARTH_OCEAN_GLSL} from './enhancedEarth.js'; -export {EARTH_CLOUD_GEOMETRY_GLSL,EARTH_OCEAN_GLSL}; +import {EARTH_CLOUD_GEOMETRY_GLSL,EARTH_CLOUD_COVER_GLSL,EARTH_OCEAN_GLSL} from './enhancedEarth.js'; +export {EARTH_CLOUD_GEOMETRY_GLSL,EARTH_CLOUD_COVER_GLSL,EARTH_OCEAN_GLSL}; const NOISE = ` float h31(vec3 p){ p=fract(p*0.3183099+0.1); p*=17.0; return fract(p.x*p.y*p.z*(p.x+p.y+p.z)); } @@ -176,6 +176,7 @@ ${TERRAIN_SHADOW_GLSL} ${RING_TRANSPORT_GLSL} ${NOISE} ${EARTH_CLOUD_GEOMETRY_GLSL} +${EARTH_CLOUD_COVER_GLSL} ${EARTH_OCEAN_GLSL} // Every registered layer of a body shares one source grid. main computes this // once per fragment (u, v, source latitude) and passes it to each lookup, so the @@ -263,12 +264,13 @@ void main(){ // A separate, raised transparent shell. This branch is removed from the // physical ground specialization; cloud haze remains explicitly illustrative. vec4 clouds=earthCloudSample(p); - if(clouds.a<=0.001) discard; + float alpha=clouds.a*earthCloudCover(dot(N,normalize(u_light))); + if(alpha<=0.001) discard; float lambert=max(dot(N,normalize(u_light)),0.0); vec3 color=decodeSRGB(coveredRGB(clouds))*(.001+.999*lambert); vec3 path=hazeOverSurface(color,N,V,normalize(u_light),1.0); color+=path; - o=vec4(u_linearOutput==1?color:encodeSRGB(color),clouds.a);return; + o=vec4(u_linearOutput==1?color:encodeSRGB(color),alpha);return; } if(u_mode==1){ if(u_style<0){ diff --git a/docs/rfcs/0008-enhanced-earth.md b/docs/rfcs/0008-enhanced-earth.md index e82d9bf0..3089c579 100644 --- a/docs/rfcs/0008-enhanced-earth.md +++ b/docs/rfcs/0008-enhanced-earth.md @@ -39,10 +39,12 @@ Raise the cloud ellipsoid homothetically by a nominal 8 km at the equator (slightly less at the poles). Reuse the sphere mesh and base program in a transparent cloud pass, back-face culled, depth-tested and without depth writes. The base program's existing haze approximation lights the cloud shell; this is -not dense-cloud or volumetric optical transfer. The ground retains its existing -reference atmosphere. Cloud shadows trace straight sunlight rays from the oblate -ground to this same shell and sample the same phase, attenuating direct sunlight -only. No fixed screen-space or longitude offset is used. +not dense-cloud or volumetric optical transfer. Night-side coverage falls off so +Black Marble remains on the ground pass, and a close view with the physical +atmosphere shell does not also add illustrative cloud haze. The ground retains +its existing reference atmosphere. Cloud shadows trace straight sunlight rays +from the oblate ground to this same shell and sample the same phase, attenuating +direct sunlight only. No fixed screen-space or longitude offset is used. Drift adds 3% of the visible Earth rotation, capped at 0.002 turns per real second, using a bounded phase advanced once per successful animation tick. The clock is diff --git a/docs/validation/enhanced-earth/README.md b/docs/validation/enhanced-earth/README.md index 7d59c11f..1ccef71c 100644 --- a/docs/validation/enhanced-earth/README.md +++ b/docs/validation/enhanced-earth/README.md @@ -10,8 +10,10 @@ maps, protects coarse land/ice with a conservative offshore mask, and darkens only dark blue water colors in linear light. A homothetic cloud shell is nominally 8 km above the equator. Ground shadows intersect that shell toward the Sun and use the same drifting UV phase. The cloud pass uses illustrative haze, while the -ground retains reference optical transfer. No source image, observation epoch, -ephemeris or other body's appearance is modified. +ground retains reference optical transfer. Night-side coverage falls off so +Black Marble remains on the ground pass, and a close view with the physical +atmosphere shell does not also add illustrative cloud haze. No source image, +observation epoch, ephemeris or other body's appearance is modified. Cloud drift follows 3% of displayed Earth rotation, capped at 0.002 turns per real second. Pause, hidden/inactive scenes and reduced motion freeze the phase; camera diff --git a/tests/web/enhancedEarth.test.mjs b/tests/web/enhancedEarth.test.mjs index 70d719b8..c32d0e8c 100644 --- a/tests/web/enhancedEarth.test.mjs +++ b/tests/web/enhancedEarth.test.mjs @@ -45,6 +45,7 @@ test('raised cloud draw shares shadow phase, omits ground clouds and keeps trans assert.ok(cloud.enabled.has(h.gl.CULL_FACE));assert.deepEqual(cloud.blend,[h.gl.SRC_ALPHA,h.gl.ONE_MINUS_SRC_ALPHA]); assert.equal(cloud.uniforms.u_earthNight,0);assert.equal(cloud.uniforms.u_earthIce,0); assert.equal(cloud.textures.get(3),ground.textures.get(3)); + assert.ok(cloud.uniforms.u_hazeRayleighTau.some(value=>value!==0),'distant clouds keep illustrative haze'); }); test('cloud off, missing maps and daily ground-containing swaths cannot lift or cast cloud shadows',async t=>{ @@ -71,6 +72,15 @@ test('drift advances only with visible animated Earth and survives paused camera assert.equal(cloudDraws(h).at(-1).uniforms.u_cloudPhase,moved); }); +test('night cloud cover stays clear until the shell is actually lit',()=>{ + const g=geometryInterpreter(shaders.EARTH_CLOUD_COVER_GLSL||''); + const cover=sun=>g.run('earthCloudCover',[sun]).value; + assert.equal(cover(-0.2),0); + assert.equal(cover(0),0); + assert.equal(cover(1),1); + assert.equal(cover(0.05),0); +}); + test('executed shadow geometry follows the Sun and hits the elevated ellipsoid at grazing angles',()=>{ const g=geometryInterpreter(shaders.EARTH_CLOUD_GEOMETRY_GLSL||''); const hit=(p,l,oblate=1)=>g.run('earthCloudHit',[p,l,oblate,1.01]).value; @@ -118,6 +128,7 @@ test('physical ground program gets enhancement uniforms while cloud rendering st assert.ok(ground,'physical atmosphere and enhanced ground coexist'); assert.equal(ground.uniforms.u_earthCloudShadow,1);assert.equal(ground.uniforms.u_earthWeather,0); const cloud=cloudDraws(h).at(-1);assert.ok(cloud);assert.equal(cloud.uniforms.u_atmosphereEnabled,0); + assert.deepEqual(cloud.uniforms.u_hazeRayleighTau,[0,0,0]); assert.equal(cloud.uniforms.u_cloudPhase,ground.uniforms.u_cloudPhase); assert.deepEqual(h.errors,[]); }); diff --git a/tests/web/fixtures/glslFloat32Geometry.mjs b/tests/web/fixtures/glslFloat32Geometry.mjs index 66ee0806..2f2b48c1 100644 --- a/tests/web/fixtures/glslFloat32Geometry.mjs +++ b/tests/web/fixtures/glslFloat32Geometry.mjs @@ -28,6 +28,10 @@ export function geometryInterpreter(glsl){ const functions=new Map(parsed.statements.filter(ts.isFunctionDeclaration).map(node=>[node.name.text,node])); const builtins={...Object.fromEntries([...structs].map(([name,fields])=>[name,(...args)=>Object.fromEntries(fields.map((field,i)=>[field,args[i]]))])),vec2:(...a)=>vector(2,a),vec3:(...a)=>vector(3,a),sqrt:x=>f(Math.sqrt(x)), min:(a,b)=>zip(a,b,Math.min),max:(a,b)=>zip(a,b,Math.max),length:a=>f(Math.sqrt(dot(a,a))), + smoothstep:(edge0,edge1,x)=>{ + const t=Math.min(1,Math.max(0,f(f(f(x)-f(edge0))/f(f(edge1)-f(edge0))))); + return f(f(f(t)*f(t))*f(f(3)-f(f(2)*f(t)))); + }, dot,abs:Math.abs, normalize:a=>{const n=f(Math.sqrt(dot(a,a)));return a.map(v=>f(v/n));}, floatBitsToUint:x=>{view.setFloat32(0,x,true);return view.getUint32(0,true);},