mapspinner 0.1.47 → 0.1.48

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mapspinner",
3
- "version": "0.1.47",
3
+ "version": "0.1.48",
4
4
  "description": "WebGL2 Earth-scale terrain rendering SDK for interactive globe applications",
5
5
  "main": "src/index.js",
6
6
  "exports": {
package/src/gl-render.js CHANGED
@@ -421,8 +421,8 @@ export async function initMapspinnerRender(gl, opts = {}) {
421
421
  gl.uniform1f(loc('vtxDetail'), g('vtxDetail', 1.0)); // DECISIVE: vtxDisplace strength (early-return on 0)
422
422
  gl.uniform1f(loc('canyonDepthMul'), g('canyonDepth', 1.0));
423
423
  gl.uniform1f(loc('uVsCheap'), (typeof window!=='undefined' && window.__vsCheap) ? 1.0 : 0.0); // VS carve-cost profiling A/B
424
- gl.uniform1f(loc('uBeachShelfM'), g('beachShelf', 28000.0)); // land coastal shelf (geometry); probe MUST match render
425
- gl.uniform1f(loc('uLandBias'), g('landBias', 680.0)); // +650m hypsometry bias = ~+30% land:sea (measured: landFrac 0.041 -> 0.054 over a 700-dir sphere grid, user 2026-06-14). window.__landBias dials it live.
424
+ gl.uniform1f(loc('uBeachShelfM'), g('beachShelf', 0.0)); // land coastal shelf (geometry); probe MUST match render
425
+ gl.uniform1f(loc('uLandBias'), g('landBias', 0.0)); // +650m hypsometry bias = ~+30% land:sea (measured: landFrac 0.041 -> 0.054 over a 700-dir sphere grid, user 2026-06-14). window.__landBias dials it live.
426
426
  gl.uniform1f(loc('cliffAmt'), g('cliffAmt', 1.0));
427
427
  gl.uniform1i(loc('uFloatLinearOK'), _halfFloatLinearOK ? 1 : 0);
428
428
  // FXC unroll-defeat (2026-06-12 AMD d3d11 fix): runtime octave bound for broadShapeM; the shader
@@ -961,8 +961,8 @@ export async function initMapspinnerRender(gl, opts = {}) {
961
961
  const _g = (n,d)=> (typeof window!=='undefined' && window['__'+n]!=null) ? +window['__'+n] : d;
962
962
  gl.uniform1f(U('canyonDepthMul'), _g('canyonDepth', 1.0));
963
963
  gl.uniform1f(U('uVsCheap'), (typeof window!=='undefined' && window.__vsCheap) ? 1.0 : 0.0); // VS carve-cost profiling A/B
964
- gl.uniform1f(U('uBeachShelfM'), _g('beachShelf', 28000.0)); // land coastal shelf (geometry): h<S eased h*h/S = wide beach
965
- gl.uniform1f(U('uLandBias'), _g('landBias', 680.0)); // +650m hypsometry bias = ~+30% land:sea (window.__landBias); MUST match the probe (setComposeHeightUniforms) for collision parity
964
+ gl.uniform1f(U('uBeachShelfM'), _g('beachShelf', 0.0)); // land coastal shelf (geometry): h<S eased h*h/S = wide beach
965
+ gl.uniform1f(U('uLandBias'), _g('landBias', 0.0)); // +650m hypsometry bias = ~+30% land:sea (window.__landBias); MUST match the probe (setComposeHeightUniforms) for collision parity
966
966
  gl.uniform1f(U('uHiFreqCut'), _g('hiFreqCut', 0.25)); // 0.5->0.25 (2026-06-10 'blotchy' -- see setComposeHeightUniforms)
967
967
  gl.uniform1f(U('uVertexAO'), _g('vertexAO', 1.0)); // per-vertex shading/AO strength (DEFECT 2, 2026-06-06)
968
968
  gl.uniform1f(U('cliffAmt'), _g('cliffAmt', 1.0));
@@ -627,11 +627,13 @@ highp float composeHeight(vec3 dir0, highp vec2 faceLocal, float tileM){ // W7
627
627
  // C1 WATERLINE (user 2026-06-14 'geometry crease + shading/rock hard line where land meets beach'):
628
628
  // the land shelf is FLAT at the waterline (slope 0) but the seabed used slope 0.24 from h=0 -> a
629
629
  // slope discontinuity = a crease (+ the shading brightness line + rock where steep) right at the
630
- // shore. Ease the shallow seabed with the SAME flat-at-waterline shelf curve (mirror of the land
631
- // side) before the 0.24/1.19 bathymetry, so BOTH sides meet the waterline with slope 0 = no crease.
632
- highp float bShelfS = uBeachShelfM > 1.0 ? uBeachShelfM : 600.0;
630
+ // shore. Ease ONLY a NARROW band of depth (NOT the 28km land beach width -- that shallowed the
631
+ // whole ocean into 'almost-land everywhere', user 2026-06-14) with the flat-at-waterline curve so
632
+ // both sides meet the waterline at slope 0 (no crease); beyond SEABED_EASE the true bathymetry
633
+ // resumes so the ocean goes DEEP.
634
+ const highp float SEABED_EASE = 300.0; // metres of depth flattened at the shore (decoupled from the land beach)
633
635
  highp float d0 = -h;
634
- highp float d = (d0 < bShelfS) ? (d0 * d0 / bShelfS) * (2.0 - d0 / bShelfS) : d0;
636
+ highp float d = (d0 < SEABED_EASE) ? (d0 * d0 / SEABED_EASE) * (2.0 - d0 / SEABED_EASE) : d0;
635
637
  h = -(min(d, 500.0) * 0.24 + max(d - 500.0, 0.0) * 1.19);
636
638
  h = max(h, -11000.0); // cap depth at Mariana Trench (~11km)
637
639
  } else {
@@ -860,9 +862,9 @@ void main() {
860
862
  // shelf/slope bathymetry remap + underwater displacement -- MUST mirror composeHeight exactly
861
863
  // (this is the FS-material running value; composeHeight is the geometry/probe height).
862
864
  if (vH < 0.0) {
863
- highp float bShelfS = uBeachShelfM > 1.0 ? uBeachShelfM : 600.0; // C1 waterline -- mirror composeHeight exactly
865
+ const highp float SEABED_EASE = 300.0; // mirror composeHeight: narrow waterline ease, deep ocean beyond
864
866
  highp float dSea0 = -vH;
865
- highp float dSea = (dSea0 < bShelfS) ? (dSea0 * dSea0 / bShelfS) * (2.0 - dSea0 / bShelfS) : dSea0;
867
+ highp float dSea = (dSea0 < SEABED_EASE) ? (dSea0 * dSea0 / SEABED_EASE) * (2.0 - dSea0 / SEABED_EASE) : dSea0;
866
868
  vH = -(min(dSea, 500.0) * 0.24 + max(dSea - 500.0, 0.0) * 1.19);
867
869
  vH = max(vH, -11000.0); // cap depth at Mariana Trench (~11km)
868
870
  } else {
@@ -2156,11 +2158,14 @@ void main() {
2156
2158
  highp vec3 segKm = pAtm - camA;
2157
2159
  highp float dKm = length(segKm);
2158
2160
  float depth = max(0.0, terrainR - length(camWorld));
2159
- // Water absorption coefficients (per km): red attenuates fastest, blue slowest.
2160
- vec3 absorb = vec3(4.0, 0.8, 0.3) * (1.0 + depth * 0.0003);
2161
+ // CLEARER WATER + LONG VISIBILITY (user 2026-06-14 'fix underwater visibility so we can explore
2162
+ // under the ocean'): the old absorb (4,0.8,0.3)/km + a 50->500m hard fog fade closed the view to
2163
+ // opaque blue within ~500m. Lower the coefficients (still red-first absorption) and push the hard
2164
+ // fade to ~3-15km so the seabed landscape is explorable; red still fades fast (realistic blue cast).
2165
+ vec3 absorb = vec3(1.0, 0.30, 0.15) * (1.0 + depth * 0.0002);
2161
2166
  vec3 uwTrans = exp(-absorb * dKm);
2162
- vec3 uwFog = vec3(0.002, 0.06, 0.16) + vec3(0.0, 0.02, 0.04) * depth / 1000.0;
2163
- color = mix(color * uwTrans + uwFog * (1.0 - uwTrans), uwFog, smoothstep(50.0, 500.0, dKm * 1000.0));
2167
+ vec3 uwFog = vec3(0.004, 0.10, 0.22) + vec3(0.0, 0.02, 0.04) * depth / 1000.0;
2168
+ color = mix(color * uwTrans + uwFog * (1.0 - uwTrans), uwFog, smoothstep(3000.0, 15000.0, dKm * 1000.0));
2164
2169
  }
2165
2170
  // RIVERS post-lighting (witnessed browser-2115/2118: the river-blue in ALBEDO is multiplied
2166
2171
  // by the warm sun irradiance (sunIrr.b is low) so land rivers lose their blue in the lit