mapspinner 0.1.48 → 0.1.49

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.48",
3
+ "version": "0.1.49",
4
4
  "description": "WebGL2 Earth-scale terrain rendering SDK for interactive globe applications",
5
5
  "main": "src/index.js",
6
6
  "exports": {
package/planet.html CHANGED
@@ -531,16 +531,24 @@ function frameLoop(){
531
531
  // the eye lands exactly eyeHeight (2.0m) above it. (The old +130m, then +3m, margin made __altM read
532
532
  // a height above an inflated reference -> the eye was really ground+margin+2m, not 2m.) The mirror
533
533
  // fallback keeps a small +3m only because the CPU jsBroadShape can under-predict vs the GPU.
534
+ let doClamp = true;
534
535
  if (gpuM != null && isFinite(gpuM)) {
535
536
  renderedM = gpuM + 1.0; // +1m margin for sub-vertex micro-relief (vtxDisplace peaks exceed 2m in rugged terrain)
537
+ } else if (r >= RADIUS) {
538
+ renderedM = jsBroadShape(cam.pos[0], cam.pos[1], cam.pos[2]) + 3.0; // above sea level: mirror is fine for land
536
539
  } else {
537
- renderedM = jsBroadShape(cam.pos[0], cam.pos[1], cam.pos[2]) + 3.0; // mirror fallback (CPU under-predicts)
540
+ // UNDERWATER DIVE FIX (user 2026-06-14 'camera stops at sea level'): below sea level with NO GPU
541
+ // probe this frame, the CPU mirror (jsBroadShape) OMITS the seaBias/bathymetry remap, so it reports
542
+ // ~sea-level over ocean and the clamp would shove the camera back up to the surface = 'stuck at sea
543
+ // level'. Skip the clamp this frame; the GPU probe (the only thing that knows the seabed) resumes
544
+ // collision next frame, so you can descend through the surface and explore the seabed.
545
+ doClamp = false; renderedM = -11000.0;
538
546
  }
539
547
  // cap to composeHeight's CMAX=15000; allow negative for seabed
540
548
  const surfElev = Math.min(renderedM, 15000.0) / WEBGL2_TERRAIN_R_M;
541
549
  const eyeHeight = 2.0 / WEBGL2_M_PER_UNIT; // EXACTLY 2.0 m above ground (km-units = 2m / m-per-unit)
542
550
  const minR = RADIUS * (1.0 + surfElev) + eyeHeight;
543
- if (r < minR) { const s = minR/r; cam.pos[0]*=s; cam.pos[1]*=s; cam.pos[2]*=s; }
551
+ if (doClamp && r < minR) { const s = minR/r; cam.pos[0]*=s; cam.pos[1]*=s; cam.pos[2]*=s; }
544
552
  const maxR = RADIUS * 50;
545
553
  if (r > maxR) { const s = maxR/r; cam.pos[0]*=s; cam.pos[1]*=s; cam.pos[2]*=s; }
546
554
 
package/src/gl-render.js CHANGED
@@ -1105,7 +1105,11 @@ export async function initMapspinnerRender(gl, opts = {}) {
1105
1105
  // shows. Cap every visible leaf at level WCAP and DEDUP to its ancestor tile: a coarse,
1106
1106
  // LOD-churn-free cover of the same footprint, typically ~10-50x fewer water vertices.
1107
1107
  // __waterSurface=0 disables live.
1108
- if (typeof window === 'undefined' || window.__waterSurface !== false) {
1108
+ // UNDERWATER: skip the sea-level water surface entirely (user 2026-06-14 'underwater looks weird,
1109
+ // we cant see anything / it must draw the sea bed'). The surface mesh drawn from below was an
1110
+ // opaque sheet that occluded the seabed; with it gone, the underwater camera sees the seabed
1111
+ // terrain directly (with the underwater fog). Above water it draws normally.
1112
+ if ((typeof window === 'undefined' || window.__waterSurface !== false) && !_uw) {
1109
1113
  // WCAP 7 -> 9 (coast witness caught it: a level-7 tile's 16-cell mesh chord sags
1110
1114
  // A_cell^2/(8R) ~ 0.8m below the true sphere mid-cell -- BELOW the metres-deep shelf
1111
1115
  // seabed, so the depth test culled the water across entire shorelines. Level-9 cells
@@ -1067,7 +1067,11 @@ void main() {
1067
1067
  // water pass: NO skirt (user 2026-06-11) -- the surface is an exact sphere at R, so adjacent
1068
1068
  // LODs agree exactly and there are no T-junction cracks to hide; a skirt would only drape a
1069
1069
  // visible curtain through the transparent shallows.
1070
- highp float skirt = (vertex.z > 0.5 && uIsWater < 0.5) ? max(defOffset.z * 0.12, 60.0) : 0.0; // W7: metres (tile-size scaled) -> highp
1070
+ // SKIRT halved (user 2026-06-14 'we keep seeing skirts' -- visible underwater/through the now-clear
1071
+ // water): 0.12->0.06 tile-scaled + floor 60->30. Still reaches below a coarser neighbor to hide the
1072
+ // LOD T-junction crack (the real discontinuity is tens of m, far under 0.06*tilespan), but the
1073
+ // vertical curtain is half as tall = far less visible when the seabed is seen through clear water.
1074
+ highp float skirt = (vertex.z > 0.5 && uIsWater < 0.5) ? max(defOffset.z * 0.06, 30.0) : 0.0; // W7: metres (tile-size scaled) -> highp
1071
1075
  vWorld = dir0 * (R + hR - skirt); // ABSOLUTE world pos (RENDER height: ocean top flat) -> FS lighting/atmosphere
1072
1076
  // TEXTURE DOMAIN WARP -- VS-side, DOUBLED BACK (user 2026-06-12): 225/900/3500 -> 450/1800/7000.
1073
1077
  {