<!-- SOLID CITY · part 2510 -->
ce
           * that rises a metre — near sample at 2.2 m out or far
           * sample at 5 m out — carries the plumb body: centred
           * 1.5 m out, from just under the road to just under the
           * land the face meets. A raycast, a walker, a car: all
           * meet the bank as a solid thing, the way they already
           * met the cliff. The shoulder keeps its air: the body's
           * inboard face stands a full metre out from the edge
           * line. Gentle aprons under a metre's rise stay open
           * ground — they are the land itself, not a face. */
          var cxp = mx + sd * rx * 1.5, czp = mz + sd * rz * 1.5;
          var riseNear = groundAt(mx + sd * rx * 2.2, mz + sd * rz * 2.2) - edgeY;
          var riseFar = groundAt(mx + sd * rx * 5, mz + sd * rz * 5) - edgeY;
          var cskip = riseNear <= 0.9 && riseFar <= 0.9;
          if (!cskip) for (var j2 = 0; j2 < JX.length && !cskip; j2++) if (Math.hypot(cxp - JX[j2][0], czp - JX[j2][1]) < 11) cskip = true;
          if (!cskip) for (var k2 = 0; k2 < driveMouths.length && !cskip; k2++) if (Math.hypot(cxp - driveMouths[k2][0], czp - driveMouths[k2][1]) < 4.5) cskip = true;
          if (!cskip && !foreignClear(cxp, czp, nm, i)) cskip = true;
          if (cskip) { cflush(); continue; }
          var cy1 = edgeY + Math.min(Math.max(riseNear, riseFar, groundAt(cxp, czp) - edgeY), 7) - 0.3, cy0 = edgeY - 0.6;
          if (cy1 - cy0 < 1.2) { cflush(); continue; }
          if (crun) {
            var cadx = cxp - crun.x1, cadz = czp - crun.z1, crdx = crun.x1 - crun.x0, crdz = crun.z1 - crun.z0;
            var cturn = Math.abs(Math.atan2(-cadz, cadx) - Math.atan2(-crdz, crdx));
            var cchx = cxp - crun.x0, cchz = czp - crun.z0, cchl = Math.hypot(cchx, cchz) || 1;
            var cdev = Math.abs((crun.x1 - crun.x0) * cchz - (crun.z1 - crun.z0) * cchx) / cchl;
            if (cturn > 0.06 || Math.hypot(crun.x1 - crun.x0, crun.z1 - crun.z0) > 4 || cdev > 0.25) cflush();
          }
          var csegHi = Math.max(ca[1], cb[1]), csegLo = Math.min(ca[1], cb[1]);
          if (crun && (Math.max(crun.hi, csegHi) - Math.min(crun.lo, csegLo) > 0.8)) cflush();
          if (!crun) crun = { x0: cxp, z0: czp, x1: cxp, z1: czp, y0: cy0, y1: cy1, hi: csegHi, lo: csegLo };
          else { crun.x1 = cxp; crun.z1 = czp; if (cy0 < crun.y0) crun.y0 = cy0; if (cy1 > crun.y1) crun.y1 = cy1; if (csegHi > crun.hi) crun.hi = csegHi; if (csegLo < crun.lo) crun.lo = csegLo; }
        }
        flush(); cflush();
      });
    });
  }
  /* THE SOLID BRIDGE (the King's design, 2026-10-13 ~23:53, from
   * the slab render's evidence): at the B2 hairpin the bend's inner
   * bank chords over the descending road — grass covering the top
   * of the pavement. His word: "make a tiny bridge and have a
   * plaque on the side of it that says SOLID." So the crossing is
   * formalized, not erased: a turf bridge where the slope already
   * flows — a stone deck slab with grass crown and stone edge
   * beams, two stone abutments (a low face on the knob side, a
   * sturdy pier on the falling side), grass ramps so a walker
   * crosses over the traffic, 3.1 m of air over the carriageway,
   * and a plaque on each traffic face: SOLID. */
  function buildSolidBridge() {
    var sts = smithRoads.B2.stations, bi = -1, bd = 1e12;
    sts.forEach(function (s2, i2) { var d = (s2.x - 1023) * (s2.x - 1023) + (s2.z + 1637) * (s2.z + 1637); if (d < bd) { bd = d; bi = i2; } });
    if (bi < 0 || bd > 900) return;
    var s = sts[bi], ry = Math.atan2(s.fx, s.fz);
    /* the deck rides its station (3.64 above the road's heart:
     * 3.09 of air under the slab) — if the profile is ever re-cut,
     * the bridge climbs with its road */
    var TOP = Math.round((s.y + 3.64) * 10) / 10, SLAB = 0.55, W = 7.0, cx = s.x, cz = s.z;
    var eA = [cx - s.rx * 5.65, cz - s.rz * 5.65], eB = [cx + s.rx * 5.65, cz + s.rz * 5.65];
    var gA = groundAt(eA[0], eA[1]) - 0.3, gB = groundAt(eB[0], eB[1]) - 0.3;
    var hA = (TOP - SLAB) - gA, hB = (TOP - SLAB) - gB;
    BASE = M4(cx, TOP, cz, ry, 0, 0);
    box(solid, 13.6, SLAB, W, 0, -SLAB / 2, 0, C.stone);
    box(solid, 13.2, 0.16, 6.6, 0, 0.08, 0, C.lawn);
    box(solid, 13.6, 0.8, 0.5, 0, -0.55, 3.25, C.stone);
    box(solid, 13.6, 0.8, 0.5, 0, -0.55, -3.25, C.stone);
    box(solid, 2.3, hA, 6.4, -5.65, -SLAB - hA / 2, 0, C.stone);
    box(solid, 2.3, hB, 6.4, 5.65, -SLAB - hB / 2, 0, C.stone);
    BASE = new T.Matrix4();
    standQuad(cx, TOP + 0.16, cz, ry, 0, 13.2, 6.6, 0.05);
    function grassRamp(x0, z0, y0, x1, z1, y1) {
      var len = Math.hypot(x1 - x0, z1 - z0), n = Math.max(1, Math.round(len / 1.6)), ang = Math.atan2(x1 - x0, z1 - z0), run = len / n;
      for (var j = 0; j < n; j++) {
        var ga = y0 + (y1 - y0) * (j / n), gb = y0 + (y1 - y0) * ((j + 1) / n);
        var px = x0 + (x1 - x0) * ((j + 0.5) / n), pz = z0 + (z1 - z0) * ((j + 0.5) / n);
        var prx = -Math.a