<!-- SOLID CITY · part 2845 -->
;
  }
  var deco = decoTextures();
  var octaMat = new THREE.MeshPhongMaterial({
    map: deco.map, emissive: 0x9fefff, emissiveMap: deco.glow, emissiveIntensity: 0.8,
    shininess: 70, specular: 0x886622
  });
  var octa = new THREE.Mesh(new THREE.OctahedronGeometry(4.2), octaMat);
  octa.position.set(0, 1.35, 0); group.add(octa);
  // a soft shadow disc grounds it on the pool floor
  var octaShadow = new THREE.Mesh(new THREE.CircleGeometry(4.6, 28),
    new THREE.MeshBasicMaterial({ color: 0x062a30, transparent: true, opacity: 0.28, depthWrite: false }));
  octaShadow.rotation.x = -Math.PI / 2; octaShadow.position.y = -0.83; group.add(octaShadow);
  // its glow, lent to the water around it
  var octaLight = new THREE.PointLight(0x54e0f0, 0.85, 34, 1.6);
  octaLight.position.set(0, 3.4, 0); group.add(octaLight);

  /* ================= SECTION 3 — koi & waterfalls ======================
     The living water. Twelve koi circle the face slowly — orange, white,
     black, gold — and four small falls step in from planted corners. */
  var KOI_COLORS = [0xff7f2a, 0xf5f2e8, 0x22242a, 0xffc93c, 0xe8452c, 0xff7f2a, 0xf5f2e8, 0xffc93c, 0x22242a, 0xe8452c, 0xff7f2a, 0xf5f2e8];
  var koi = [];
  for (var ki = 0; ki < 12; ki++) {
    var kg = new THREE.Group();
    var kmat = lam(KOI_COLORS[ki]);
    var body = new THREE.Mesh(SPH, kmat); body.scale.set(0.34, 0.36, 1.15); kg.add(body);
    var tail = new THREE.Mesh(CONE, kmat); tail.scale.set(0.06, 0.55, 0.42);
    tail.position.set(0, 0.02, -0.62); tail.rotation.x = Math.PI / 2; kg.add(tail);
    var fin = new THREE.Mesh(CONE, kmat); fin.scale.set(0.30, 0.30, 0.05);
    fin.position.set(0, 0.20, 0.05); kg.add(fin);
    group.add(kg);
    koi.push({
      g: kg, tail: tail,
      rx: 6.2 + (ki % 4) * 1.5, rz: (6.2 + (ki % 4) * 1.5) * 0.60,
      sp: (0.05 + (ki % 5) * 0.012) * (ki % 3 === 0 ? -1 : 1),
      ph: ki * 1.93, yb: -0.52 + (ki % 3) * 0.05
    });
  }
  // waterfalls — streaked planes from raised planters at the pool corners
  function fallTexture() {
    var c = document.createElement('canvas'); c.width = 128; c.height = 128;
    var g = c.getContext('2d'); g.clearRect(0, 0, 128, 128);
    for (var i = 0; i < 30; i++) {
      var x = (i * 37) % 124 + 2, w = 2 + (i % 3), a = 0.10 + ((i * 7) % 10) / 40;
      g.fillStyle = 'rgba(230,250,255,' + a + ')'; g.fillRect(x, 0, w, 128);
    }
    var t = new THREE.CanvasTexture(c);
    t.wrapS = t.wrapT = THREE.RepeatWrapping; t.repeat.set(1, 1.6);
    return t;
  }
  var fallTex = fallTexture();
  var fallMat = new THREE.MeshLambertMaterial({ color: 0xbfeef7, transparent: true, opacity: 0.55, map: fallTex, side: THREE.DoubleSide, depthWrite: false });
  var foamMat = new THREE.MeshBasicMaterial({ color: 0xffffff, transparent: true, opacity: 0.4, depthWrite: false });
  var foams = [];
  [[-20.5, -14.5], [20.5, -14.5], [-20.5, 14.5], [20.5, 14.5]].forEach(function (p, i) {
    mesh(BOX, MAT.stoneDark, group, p[0], 0.55, p[1], 3.4, 1.1, 2.2);
    mesh(BOX, MAT.stone, group, p[0], 1.13, p[1], 3.6, 0.08, 2.4);
    mesh(SPH, MAT.leaf, group, p[0] - 0.7, 1.35, p[1], 1.6, 0.8, 1.6);
    mesh(SPH, MAT.leaf2, group, p[0] + 0.8, 1.3, p[1] + 0.3, 1.3, 0.7, 1.3);
    var sx = p[0] > 0 ? -1 : 1, sz = p[1] > 0 ? -1 : 1;
    var fall = new THREE.Mesh(new THREE.PlaneGeometry(1.7, 1.9), fallMat);
    fall.position.set(p[0] + sx * 1.55, 0.38, p[1] + sz * 1.05);
    fall.rotation.order = 'YXZ';
    fall.rotation.y = Math.atan2(sx, sz) + Math.PI;
    fall.rotation.x = -0.62;
    group.add(fall);
    var foam = new THREE.Mesh(new THREE.CircleGeometry(0.85, 16), foamMat);
    foam.rotation.x = -Math.PI / 2;
    foam.position.set(p[0] + sx * 2.6, -0.27, p[1] + sz * 1.8);
    group.add(foam); foams.push(foam);
  });

  /* ================= SECTION 4 — palms, colonnade, lanterns, plate =====
     The courtyard dressed: palms at the corners, an arched colonnade along
     the east edge (the courtyard opens west, to the sea), lanterns, two
     benches for sitting with the koi — and the plate with the King's words. */
  function palm(x, z, lean) {
    var g = new THREE.Group(); g.position.set(x, 0, z); group.add(g);
    mesh(CYL, MAT.trunk, g, 0, 1.1, 0, 0.55, 2.2, 0.55);
    mesh(CYL, MAT.trunk, g, lean * 0.3, 3.0, 0, 0.46, 1.9, 0.46);
    mesh(CYL, MAT.trunk, g, lean * 0.75, 4.6, 0, 0.36, 1.6, 0.36);
    var topX = lean * 1.05;
    for (var f = 0; f < 6; f++) {
      var a = (f / 6) * Math.PI * 2 + x;
      var fr = mesh(CONE, f % 2 ? MAT.leaf : MAT.leaf2, g, topX + Math.cos(a) * 1.5, 5.6, Math.sin(a) * 1.5, 0.85, 3.4, 0.3);
      fr.rotation.set(Math.sin(a) * 1.15, 0, -Math.cos(a) * 1.15);
    }
    mesh(SPH, MAT.leaf2, g, topX, 5.45, 0, 1.1, 0.7, 1.1);
    return [x, z, 0.55, 0.55, 0, 4.6, 0];
  }
  var palmPrints = [
    palm(-24, -19, 0.6), palm(-24, 19, -0.4), palm(-12, -20.5, 0.3),
    palm(12, -20.5, -0.5), palm(-12, 20.5, 0.5), palm(12, 20.5, -0.3)
  ];
  // colonnade — five columns and their arcs 