mapspinner 0.1.48 → 0.1.50
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 +1 -1
- package/planet.html +10 -2
- package/src/gl-render.js +5 -1
- package/src/shaders/terrain.glsl +18 -7
package/package.json
CHANGED
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
|
-
|
|
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
|
-
|
|
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
|
package/src/shaders/terrain.glsl
CHANGED
|
@@ -631,10 +631,14 @@ highp float composeHeight(vec3 dir0, highp vec2 faceLocal, float tileM){ // W7
|
|
|
631
631
|
// whole ocean into 'almost-land everywhere', user 2026-06-14) with the flat-at-waterline curve so
|
|
632
632
|
// both sides meet the waterline at slope 0 (no crease); beyond SEABED_EASE the true bathymetry
|
|
633
633
|
// resumes so the ocean goes DEEP.
|
|
634
|
-
const highp float SEABED_EASE =
|
|
634
|
+
const highp float SEABED_EASE = 120.0; // metres of depth flattened at the shore (decoupled from the land beach)
|
|
635
635
|
highp float d0 = -h;
|
|
636
636
|
highp float d = (d0 < SEABED_EASE) ? (d0 * d0 / SEABED_EASE) * (2.0 - d0 / SEABED_EASE) : d0;
|
|
637
|
-
|
|
637
|
+
// STEEPER DROP-OFF (user 2026-06-14 'seabed flat/close to waterline; steeper + more relief'):
|
|
638
|
+
// narrow shelf 500->150m raw, steeper shelf 0.24->0.6, steeper continental slope 1.19->1.5 so the
|
|
639
|
+
// seabed plunges to deep water just offshore (less flat shallow shelf) and the deep bathymetry
|
|
640
|
+
// carries 1.5x the bShape relief = more dramatic underwater terrain to explore.
|
|
641
|
+
h = -(min(d, 150.0) * 0.6 + max(d - 150.0, 0.0) * 1.5);
|
|
638
642
|
h = max(h, -11000.0); // cap depth at Mariana Trench (~11km)
|
|
639
643
|
} else {
|
|
640
644
|
// LAND COASTAL SHELF (user 2026-06-14: 'beaches not wide enough'): the underwater shelf above
|
|
@@ -652,7 +656,10 @@ highp float composeHeight(vec3 dir0, highp vec2 faceLocal, float tileM){ // W7
|
|
|
652
656
|
}
|
|
653
657
|
// displacement now continues UNDERWATER (the old land-only gate served the flat-clamped ocean,
|
|
654
658
|
// gone since 026d530): the seabed carries the same micro-relief as land = realistic continuation.
|
|
655
|
-
|
|
659
|
+
// SEABED RELIEF BOOST (user 2026-06-14 'more relief' to explore): amplify the micro-relief with DEPTH
|
|
660
|
+
// (1x at the shore -> 2.2x by 600m down) so the deep seabed is rugged/interesting, while shallow water
|
|
661
|
+
// stays calm so the boost never lifts the bed toward sea level (no 'almost-land').
|
|
662
|
+
h += vDisp * mix(1.0, 2.2, clamp((h + 50.0) / -550.0, 0.0, 1.0));
|
|
656
663
|
// PERLIN-EVERYWHERE ELEVATION (user 2026-06-10 'it must also affect elevation'): the same detailFbm
|
|
657
664
|
// the FS albedo overlay shows, as real relief (~30m per lever unit -> ~180m at the user-tuned 6).
|
|
658
665
|
// Shore-gated (fades in over the first 250m of land) so the coastline and the flat water planes are
|
|
@@ -862,17 +869,17 @@ void main() {
|
|
|
862
869
|
// shelf/slope bathymetry remap + underwater displacement -- MUST mirror composeHeight exactly
|
|
863
870
|
// (this is the FS-material running value; composeHeight is the geometry/probe height).
|
|
864
871
|
if (vH < 0.0) {
|
|
865
|
-
const highp float SEABED_EASE =
|
|
872
|
+
const highp float SEABED_EASE = 120.0; // mirror composeHeight: narrow waterline ease, deep ocean beyond
|
|
866
873
|
highp float dSea0 = -vH;
|
|
867
874
|
highp float dSea = (dSea0 < SEABED_EASE) ? (dSea0 * dSea0 / SEABED_EASE) * (2.0 - dSea0 / SEABED_EASE) : dSea0;
|
|
868
|
-
vH = -(min(dSea,
|
|
875
|
+
vH = -(min(dSea, 150.0) * 0.6 + max(dSea - 150.0, 0.0) * 1.5); // steeper drop-off (mirror composeHeight)
|
|
869
876
|
vH = max(vH, -11000.0); // cap depth at Mariana Trench (~11km)
|
|
870
877
|
} else {
|
|
871
878
|
highp float bShelf = uBeachShelfM > 1.0 ? uBeachShelfM : 600.0; // LAND COASTAL SHELF -- mirror composeHeight exactly (wide beach, user 2026-06-14); guard stale/unset uniform
|
|
872
879
|
if (vH < bShelf) vH = (vH * vH / bShelf) * (2.0 - vH / bShelf); // C1-continuous (mirror composeHeight) -- removes the beach-top slope kink / hard shading line
|
|
873
880
|
|
|
874
881
|
}
|
|
875
|
-
vH += vDisp;
|
|
882
|
+
vH += vDisp * mix(1.0, 2.2, clamp((vH + 50.0) / -550.0, 0.0, 1.0)); // seabed relief boost (mirror composeHeight)
|
|
876
883
|
vH += detailFbm(dir0) * uDetailOverlay * 30.0 * step(0.0, vH);
|
|
877
884
|
// FLAT-AREA VALLEY NETWORKS + LAKES (user 2026-06-13): incised valley systems in low-relief
|
|
878
885
|
// plains -- must mirror composeHeight for FS material consistency.
|
|
@@ -1067,7 +1074,11 @@ void main() {
|
|
|
1067
1074
|
// water pass: NO skirt (user 2026-06-11) -- the surface is an exact sphere at R, so adjacent
|
|
1068
1075
|
// LODs agree exactly and there are no T-junction cracks to hide; a skirt would only drape a
|
|
1069
1076
|
// visible curtain through the transparent shallows.
|
|
1070
|
-
|
|
1077
|
+
// SKIRT halved (user 2026-06-14 'we keep seeing skirts' -- visible underwater/through the now-clear
|
|
1078
|
+
// water): 0.12->0.06 tile-scaled + floor 60->30. Still reaches below a coarser neighbor to hide the
|
|
1079
|
+
// LOD T-junction crack (the real discontinuity is tens of m, far under 0.06*tilespan), but the
|
|
1080
|
+
// vertical curtain is half as tall = far less visible when the seabed is seen through clear water.
|
|
1081
|
+
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
1082
|
vWorld = dir0 * (R + hR - skirt); // ABSOLUTE world pos (RENDER height: ocean top flat) -> FS lighting/atmosphere
|
|
1072
1083
|
// TEXTURE DOMAIN WARP -- VS-side, DOUBLED BACK (user 2026-06-12): 225/900/3500 -> 450/1800/7000.
|
|
1073
1084
|
{
|