<!-- SOLID CITY · part 2643 -->
tR;
      if (slopeAt(px, pz, 5) > 0.85) return -1;
      if (Math.abs(groundAt(px, pz) - h) > lotR * 0.62 + 6) return -1;
    }
    return h;
  }
  function lotHeight(x, z, r) {            // pad height: near-max of the lot so the pad never buries
    var m = -1e9, i, j;
    for (i = -1; i <= 1; i++) for (j = -1; j <= 1; j++) { var h = groundAt(x + i * r, z + j * r); if (h > m) m = h; }
    return m + 0.25;
  }

  /* ================= VEGETATION & GARDENS (local frame: origin at plant base, ground y=0) ================= */
  function monkeypod(s) {           // the great umbrella tree of the compound image
    trunkBody();
    cyl(solid, 0.32 * s, 0.5 * s, 3.4 * s, 7, 0, 1.7 * s, 0, C.trunk);
    cyl(solid, 0.16 * s, 0.3 * s, 2.6 * s, 6, 1.1 * s, 4.2 * s, 0.4 * s, C.trunk, 0, 0, 0.7);
    cyl(solid, 0.16 * s, 0.3 * s, 2.6 * s, 6, -1.1 * s, 4.2 * s, -0.3 * s, C.trunk, 0, 0, -0.7);
    sph(solid, 4.6 * s, 0, 6.4 * s, 0, C.leaf, 0.42);
    sph(solid, 3.4 * s, 2.6 * s, 5.9 * s, 1 * s, C.leafDeep, 0.4);
    sph(solid, 3.2 * s, -2.7 * s, 6.0 * s, -0.8 * s, C.leafLight, 0.4);
  }
  function palm(s) {                 // tall slender palm of the Hilo photos
    trunkBody();
    var lean = (R() - 0.5) * 0.14;
    cyl(solid, 0.16 * s, 0.26 * s, 8.5 * s, 6, lean * 4 * s, 4.25 * s, 0, C.palmTrunk, 0, 0, lean);
    for (var i = 0; i < 7; i++) {
      var a = i / 7 * Math.PI * 2 + R() * 0.4;
      box(solid, 3.6 * s, 0.05, 0.55 * s, lean * 8 * s + Math.cos(a) * 1.6 * s, 8.8 * s, Math.sin(a) * 1.6 * s, C.leafLight, -a, 0, 0.62);
    }
    sph(solid, 0.5 * s, lean * 8 * s, 8.4 * s, 0, C.leafDeep, 0.8);
  }
  function banana() {               // banana clump: broad leaf fans
    cyl(solid, 0.14, 0.2, 2.2, 5, 0, 1.1, 0, C.banana);
    for (var i = 0; i < 5; i++) {
      var a = i / 5 * Math.PI * 2;
      box(solid, 2.6, 0.06, 0.9, Math.cos(a) * 0.9, 2.6 + (i % 2) * 0.3, Math.sin(a) * 0.9, C.banana, -a, 0, 0.5);
    }
    sph(glowB, 0.28, 0.3, 1.7, 0.2, 0xd8e878, 1.4);   // young fruit bunch
  }
  function breadfruit(s) {
    trunkBody();
    cyl(solid, 0.3 * s, 0.45 * s, 3 * s, 7, 0, 1.5 * s, 0, C.trunk);
    sph(solid, 2.9 * s, 0, 4.6 * s, 0, C.leafLight, 0.75);
    sph(solid, 2.1 * s, 1.6 * s, 3.9 * s, 0.8 * s, C.leaf, 0.7);
    sph(solid, 0.34, 0.9 * s, 3.6 * s, 0.9 * s, 0xa8c86a, 1);   // fruit
    sph(solid, 0.34, -1.1 * s, 3.9 * s, -0.6 * s, 0xa8c86a, 1);
  }
  function ohia(s) {
    trunkBody();
    cyl(solid, 0.34 * s, 0.55 * s, 3.2 * s, 7, 0, 1.6 * s, 0, C.trunk);
    sph(solid, 3 * s, 0, 4.9 * s, 0, C.leaf, 0.72);
    sph(solid, 2.2 * s, 1.7 * s, 4.2 * s, 0.7 * s, C.leafDeep, 0.68);
    sph(glowB, 0.5, 1.2 * s, 4.6 * s, 0.6 * s, C.flower3, 0.7);   // lehua blossom hint
  }
  function shrub(fl) {              // flowering shrub against the walls (Hilo photos)
    sph(solid, 0.9 + R() * 0.5, 0, 0.75, 0, R() < 0.5 ? C.leaf : C.leafDeep, 0.78);
    sph(glowB, 0.3, 0.4, 1.15, 0.25, fl, 0.8);
    sph(glowB, 0.24, -0.45, 1.0, -0.2, fl, 0.8);
  }
  function taroPatch(w, d) {        // lo'i kalo: soil bed, water, taro leaves (compound image)
    box(solid, w, 0.5, d, 0, 0.25, 0, C.soil);
    box(glassB, w - 0.8, 0.1, d - 0.8, 0, 0.56, 0, C.water);
    var n = Math.floor(w * d / 3.2);
    for (var i = 0; i < n; i++) {
      var px = (R() - 0.5) * (w - 1.4), pz = (R() - 0.5) * (d - 1.4);
      cone(solid, 0.42, 0.9, 5, px, 1.0, pz, C.taro);
      sph(solid, 0.3, px, 1.25, pz, C.taro, 0.5);
    }
  }
  function lavaWall(len, ry) {       // low dry-stack lava rock wall edging yards (building stone, not terrain)
    var n = Math.max(2, Math.round(len / 1.6));
    for (var i = 0; i < n; i++) {
      var off = -len / 2 + (i + 0.5) * (len / n);
      var lx = Math.cos(ry) * off, lz = -Math.sin(ry) * off;
      rock(solid, 0.85, lx, 0.42, lz, i % 2 ? C.stone : C.stoneDark);
    }
  }
  function yellowStones(n, spacing) {  // the King's yellow-painted path stones, in a line along +z
    for (var i = 0; i < n; i++) rock(solid, 0.32, (i % 2 ? 0.3 : -0.3), 0.16, i * spacing, C.yellowStone);
  }
  function car(color) {              // a parked car on the parking pad
    box(solid, 1.8, 0.55, 4.3, 0, 0.55, 0, color);
    box(solid, 1.6, 0.5, 2.2, 0, 1.05, -0.2, color);
    box(glassB, 1.5, 0.34, 1.1, 0, 1.08, 0.45, C.glass);
    [[-0.85, 1.4], [0.85, 1.4], [-0.85, -1.4], [0.85, -1.4]].forEach(function (w) {
      cyl(solid, 0.34, 0.34, 0.24, 8, w[0], 0.34, w[1], 0x1c1c1e, 0, 0, Math.PI / 2);
    });
  }
  function streetLight() {           // road light: pole + warm lamp (no PointLight — perf)
    cyl(solid, 0.09, 0.13, 5.2, 6, 0, 2.6, 0, C.stoneDark);
    box(solid, 1.4, 0.12, 0.12, 0.6, 5.2, 0, C.stoneDark);
    sph(glowB, 0.26, 1.25, 5.05, 0, C.warm, 0.8);
  }

  /* ================= STAND / COLLISION REGISTRATION (local frame helpers) ================= */
  // All home builders work in a local frame (origin at pad center, +z = front/door side)
  // with BASE set to the home's world matrix. Footprints +