<!-- SOLID CITY · part 2049 -->
REE, P = o.position || { x: 0, y: 0, z: 0 };
  var root = new T.Group(); root.name = 'foundry'; root.position.set(P.x, P.y, P.z);
  var foot = [];
  var basalt = new T.MeshLambertMaterial({ color: 0x1a181e });
  var steel = new T.MeshLambertMaterial({ color: 0x2a2c33 });
  var moltenM = new T.MeshBasicMaterial({ color: 0xff6a1a });
  // the yard
  var yard = new T.Mesh(new T.CylinderGeometry(44, 46, 0.4, 48),
    new T.MeshLambertMaterial({ color: 0x201d24 }));
  yard.position.y = 0.05; root.add(yard);
  var yardRim = new T.Mesh(new T.TorusGeometry(44, 0.6, 8, 48), steel);
  yardRim.rotation.x = Math.PI / 2; yardRim.position.y = 0.3; root.add(yardRim);
  // twelve pillars, dodecagonal ring
  var i, a;
  for (i = 0; i < 12; i++) {
    a = (i / 12) * Math.PI * 2;
    var px = Math.cos(a) * 36, pz = Math.sin(a) * 36;
    var pil = new T.Mesh(new T.BoxGeometry(3, 18, 3), basalt);
    pil.position.set(px, 9, pz); pil.rotation.y = -a; root.add(pil);
    var cap = new T.Mesh(new T.BoxGeometry(3.6, 1.2, 3.6), steel);
    cap.position.set(px, 18.6, pz); cap.rotation.y = -a; root.add(cap);
    foot.push([px, pz, 4.2, 4.2, 0, 19.5, 0]);
  }
  // ring beam: twelve chords
  for (i = 0; i < 12; i++) {
    a = (i / 12) * Math.PI * 2 + Math.PI / 12;
    var bx = Math.cos(a) * 36, bz = Math.sin(a) * 36;
    var beam = new T.Mesh(new T.BoxGeometry(19.5, 1.6, 2.2), steel);
    beam.position.set(bx, 19.4, bz); beam.rotation.y = -a + Math.PI / 2; root.add(beam);
  }
  // eight hanging chains (8-fold, answering the channels)
  var chains = [];
  for (i = 0; i < 8; i++) {
    a = (i / 8) * Math.PI * 2 + Math.PI / 8;
    (function (ang, idx) {
      var cx = Math.cos(ang) * 20, cz = Math.sin(ang) * 20;
      var ch = new T.Group(); ch.position.set(cx, 18.6, cz);
      var len = 9 + (idx % 3) * 2;
      var link = new T.Mesh(new T.CylinderGeometry(0.16, 0.16, len, 6), steel);
      link.position.y = -len / 2; ch.add(link);
      var hook = new T.Mesh(new T.TorusGeometry(0.8, 0.2, 6, 12, Math.PI * 1.5), steel);
      hook.position.y = -len - 0.6; hook.rotation.z = Math.PI * 0.75; ch.add(hook);
      root.add(ch); chains.push({ g: ch, ph: idx * 1.7 });
    })(a, i);
  }
  // the crucible
  var dais = new T.Mesh(new T.CylinderGeometry(10, 11, 2, 24), basalt);
  dais.position.y = 1.2; root.add(dais); foot.push([0, 0, 22, 22, 0, 2.4, 0]);
  var bowl = new T.Mesh(new T.CylinderGeometry(8, 6, 3.6, 24), steel);
  bowl.position.y = 4.0; root.add(bowl);
  var molten = new T.Mesh(new T.CircleGeometry(7.2, 32), moltenM.clone());
  molten.rotation.x = -Math.PI / 2; molten.position.y = 5.85; root.add(molten);
  var heat = new T.Mesh(new T.CylinderGeometry(5.5, 7, 14, 20, 1, true),
    new T.MeshBasicMaterial({ color: 0xff8a2a, transparent: true, opacity: 0.10, side: T.DoubleSide, blending: T.AdditiveBlending, depthWrite: false }));
  heat.position.y = 13; root.add(heat);
  var hum = new T.PointLight(0xff7a2a, 1.6, 80); hum.position.set(0, 9, 0); root.add(hum);
  var hum2 = new T.PointLight(0xffb060, 0.8, 40); hum2.position.set(0, 4, 0); root.add(hum2);
  // eight molten channels, radial, 8-fold symmetry
  var channels = [];
  for (i = 0; i < 8; i++) {
    a = (i / 8) * Math.PI * 2;
    (function (ang, idx) {
      var len = 24, mx = Math.cos(ang) * (10 + len / 2), mz = Math.sin(ang) * (10 + len / 2);
      var bed = new T.Mesh(new T.BoxGeometry(len, 0.5, 2.0), basalt);
      bed.position.set(mx, 0.45, mz); bed.rotation.y = -ang; root.add(bed);
      var flow = new T.Mesh(new T.BoxGeometry(len - 1, 0.3, 1.1), moltenM.clone());
      flow.position.set(mx, 0.72, mz); flow.rotation.y = -ang; root.add(flow);
      channels.push({ m: flow.material, ph: idx * 0.9 });
      var basin = new T.Mesh(new T.CylinderGeometry(2.2, 2.6, 1.2, 10), steel);
      basin.position.set(Math.cos(ang) * 35.5, 0.8, Math.sin(ang) * 35.5); root.add(basin);
      foot.push([Math.cos(ang) * 35.5, Math.sin(ang) * 35.5, 5, 5, 0, 1.6, 0]);
    })(a, i);
  }
  // eight braziers between the channels
  var braziers = [];
  for (i = 0; i < 8; i++) {
    a = (i / 8) * Math.PI * 2 + Math.PI / 8;
    (function (ang, idx) {
      var bx2 = Math.cos(ang) * 15, bz2 = Math.sin(ang) * 15;
      var cup = new T.Mesh(new T.CylinderGeometry(1.0, 0.7, 1.6, 8), basalt);
      cup.position.set(bx2, 1.0, bz2); root.add(cup);
      var fl = new T.Mesh(new T.ConeGeometry(0.75, 2.4, 8),
        new T.MeshBasicMaterial({ color: 0xff9a30, transparent: true, opacity: 0.9 }));
      fl.position.set(bx2, 2.8, bz2); root.add(fl);
      var pl = new T.PointLight(0xff9a30, 0.9, 26); pl.position.set(bx2, 3.4, bz2); root.add(pl);
      braziers.push({ fl: fl, ph: idx * 2.1 });
      foot.push([bx2, bz2, 2.2, 2.2, 0, 1.8, 0]);
    })(a, i);
  }
  // three ship-frames on trestles: hulls being born
  function shipFrame(px2, pz2, rot, len) {
    var g = new T.Group(); g.position.set(px2, 0, pz2); g.rotation.y = rot;
    var keel = new T.Mesh(new T.BoxGeometry(len, 0.9, 0.9), steel