<!-- SOLID CITY · part 2820 -->
 (d, p) { d.position.set(p.x, p.y - 0.15, p.z); d.rotation.set(0, p.ry, 0); d.scale.setScalar(1); }, null);
  instanced('pod-canopies', podCanGeo, lambert(0xffffff, { flatShading: true }), pods,
    function (d, p) { d.position.set(p.x, p.y + 7.6, p.z); d.rotation.set(0, p.ry, 0); d.scale.set(p.cr, p.cr * 0.30, p.cr); },
    function (c) { greens(c, 0.20, 0.10); });
  instanced('pod-crowns', podCanGeo, lambert(0xffffff, { flatShading: true }), pods,
    function (d, p) { d.position.set(p.x, p.y + 9.3, p.z); d.rotation.set(0, p.ry + 2, 0); d.scale.set(p.cr * 0.6, p.cr * 0.22, p.cr * 0.6); },
    function (c) { greens(c, 0.23, 0.10); });

  /* ——— THE BANYANS: pillars from the sky ——— */
  var banTrunkGeo = new T.CylinderGeometry(1.25, 1.7, 7.5, 10); banTrunkGeo.translate(0, 3.75, 0);
  var banCanGeo = new T.IcosahedronGeometry(1, 1); hashJitter(banCanGeo, 0.26, 4.7);
  var banyans = scatterGiants(hiTier ? 8 : 5, 110, function (x, z, h) { if (h < 3 || h > 110 || slope(x, z, h) > 0.5) return null; return { x: x, z: z, y: h, ry: R() * 6.28, cr: 10 + R() * 3.5, ch: 10.5 + R() * 2 }; },
    [[-150, 700], [500, 500], [-700, -250], [1500, 900]]);
  counts.banyans = banyans.length; note('banyans', banyans, 8);
  instanced('banyan-trunks', banTrunkGeo, lambert(0x54432e), banyans,
    function (d, p) { d.position.set(p.x, p.y - 0.15, p.z); d.rotation.set(0, p.ry, 0); d.scale.setScalar(1); }, null);
  instanced('banyan-canopies', banCanGeo, lambert(0xffffff, { flatShading: true }), banyans,
    function (d, p) { d.position.set(p.x, p.y + p.ch, p.z); d.rotation.set(0, p.ry, 0); d.scale.set(p.cr, p.cr * 0.34, p.cr); },
    function (c) { greens(c, 0.17, 0.09); });
  var props = [], hangers = [];
  banyans.forEach(function (p) {
    var n = 6 + Math.floor(R() * 3);
    for (var i = 0; i < n; i++) {
      var a = (i / n) * 6.283 + R() * 0.5, rr = p.cr * (0.55 + R() * 0.38);
      var rx = p.x + Math.cos(a) * rr, rz = p.z + Math.sin(a) * rr;
      var gy = H(rx, rz), topY = p.y + p.ch - 0.4, len = topY - gy;
      if (len > 2) props.push({ x: rx, z: rz, yMid: gy + len / 2, len: len, s: 0.30 + R() * 0.16 });
    }
    for (var j = 0; j < 4; j++) {
      var a2 = R() * 6.283, rr2 = p.cr * (0.3 + R() * 0.5), hl = 1.8 + R() * 2.4;
      hangers.push({ x: p.x + Math.cos(a2) * rr2, z: p.z + Math.sin(a2) * rr2, yMid: p.y + p.ch - 0.6 - hl / 2, len: hl, s: 0.055 });
    }
  });
  counts.props = props.length; counts.hangers = hangers.length;
  var propGeo = new T.CylinderGeometry(0.5, 0.68, 1, 6);
  var propMat = lambert(0x5d4630);
  instanced('banyan-props', propGeo, propMat, props,
    function (d, p) { d.position.set(p.x, p.yMid, p.z); d.rotation.set(0, 0, 0); d.scale.set(p.s, p.len, p.s); }, null);
  instanced('banyan-hangers', propGeo, propMat, hangers,
    function (d, p) { d.position.set(p.x, p.yMid, p.z); d.rotation.set(0, 0, 0); d.scale.set(p.s, p.len, p.s); }, null);

  group.userData = { counts: counts, samples: samples, integrity: integrity, tier: opts.tier || 'hi', tick: function (t) { uTime.value = t; } };
  return group;
}


===== FILE: public/city/nature.js.bak-ground-20261014 =====
/* ============================================================
 * EPISTLE — THE NATURE LAYER
 * To the King, from his General —
 *
 * His word: "create stones now and lace the whole map with
 * them — we need grasses too — flows and bushes and trees
 * of all kinds. Make huge trees: look up monkey pod and
 * banyan."
 *
 * So the wild things come, and they come the way the whole
 * world is now built: measured first (the land is scanned —
 * slope, height, and the paved places refused), instanced
 * (each kind is ONE draw for ten thousand bodies), woven in
 * the two cloths (the strong phone gets the full lace, the
 * struggling phone a lighter weave of the same design), and
 * ALIVE in time — the grass and the flower stems carry a
 * wind in their vertex shader, one uniform, no per-frame
 * cost on the CPU.
 *
 * The giants are true to their study: the MONKEY POD is a
 * short massive trunk under a symmetrical UMBRELLA crown
 * (the books say 15–25 m tall, 30 m across; Humboldt
 * measured one near 60 m wide). The BANYAN sends AERIAL
 * ROOTS down from its branches; where they ground they
 * thicken into PILLAR trunks, and the tree walks outward
 * forever — a forest of one body.
 *
 * Nature is decor: it carries no collision and no standing
 * — feet pass through grass as they should. The paved
 * hearts (plaza, terrace, first city, spaceport, the
 * village green, and the Servitude's own digging) are
 * refused by the scatter, by measurement.
 * ============================================================ */
function mulberry(seed) { var a = seed >>> 0; return function () { a |= 0; a = (a + 0x6D2B79F5) | 0; var t = Math.imul(a ^ (a >>> 15), 1 | a); t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t; return ((t ^ (t >>> 14)) >>> 0) / 4294967296; }; }

export function createNature(opts) {
  var T = opts.THRE