<!-- SAGA2 · part 30 -->
E.Vector3(p[0],p[1],p[2]); })), mat));
  }
  function mellipse(cx,cy,cz,rx,ry,mat,rz){
    var pts=[];
    for(var i=0;i<=24;i++){ var a=(i/24)*Math.PI*2;
      pts.push(new THREE.Vector3(cx+Math.cos(a)*rx, cy+Math.sin(a)*ry, (rz||0)+cz*0.1));
      // Actually 3D: vary z with angle for form
      pts[pts.length-1].z = cz + Math.sin(a)*ry*0.3;
    }
    mline(pts, mat);
  }
  // CRANIUM — clean sphere meridians (8)
  for(var mi=0; mi<8; mi++){
    var ma = (mi/8)*Math.PI*2, mpts=[];
    for(var mh=0; mh<=12; mh++){
      var phi = (mh/12)*Math.PI; // 0 to PI
      var mr = 5.0*Math.sin(phi);
      mpts.push([Math.cos(ma)*mr, 5.0*Math.cos(phi)+2, Math.sin(ma)*mr*0.92]);
    }
    mline(mpts, mi%2?mGold:mCyan);
  }
  // CRANIUM — latitudinal (5)
  for(var la=0; la<5; la++){
    var ly = 6.5 - la*2.2, lr = 5.0*Math.sqrt(Math.max(0,1-Math.pow((ly-2)/5.0,2)));
    var lpts=[];
    for(var la2=0; la2<=24; la2++){ var ang=(la2/24)*Math.PI*2;
      lpts.push([Math.cos(ang)*lr, ly, Math.sin(ang)*lr*0.92]);
    }
    mline(lpts, la%2?mCyan:mGold);
  }
  // FACE — sculptural relief (King: indented eyes, protruding nose, lip work)
  var eDX = 1.9, eSZ = 1.15;
  // center line
  mline([[0,7,4.6],[0,3,5.0],[0,0,5.2],[0,-2.5,5.0]], mGold);
  // brows (on surface)
  mline([[-3.2,3.2,4.2],[-eDX,3.5,4.6],[-0.8,3.2,4.7]], mGold);
  mline([[0.8,3.2,4.7],[eDX,3.5,4.6],[3.2,3.2,4.2]], mGold);
  // EYE SOCKETS — indented (concave bowl, z dips in)
  function eyeSocket(cx){
    // socket rim (surface)
    mellipse(cx, 2.0, 4.9, eSZ+0.5, eSZ*0.5+0.4, mGold);
    // socket bowl — lines curving INWARD (z decreases toward center)
    for(var sb=0; sb<3; sb++){
      var sr = eSZ+0.3-sb*0.25, sz = 4.9-sb*0.25;
      mellipse(cx, 2.0, sz, sr, sr*0.5, mCyan);
    }
    // eyeball (recessed, z=4.1)
    mellipse(cx, 2.0, 4.1, eSZ*0.7, eSZ*0.35, mCyan);
    mellipse(cx, 2.0, 4.15, 0.3, 0.3, mGold); // pupil
  }
  eyeSocket(-eDX); eyeSocket(eDX);
  // NOSE — protruding (convex, z pushes OUT)
  // bridge (rises from face)
  mline([[0,2.5,4.9],[0,1.5,5.3],[0,0.5,5.6],[0,-0.5,5.9]], mGold);
  // nose sides (showing protrusion)
  mline([[-0.4,2.0,4.95],[-0.5,1.0,5.4],[-0.6,0,5.7],[-0.7,-1.0,5.8]], mCyan);
  mline([[0.4,2.0,4.95],[0.5,1.0,5.4],[0.6,0,5.7],[0.7,-1.0,5.8]], mCyan);
  // tip (most protruding, z=6.0)
  mellipse(0, -1.2, 5.95, 0.6, 0.4, mGold);
  // nostrils (under tip, recessed)
  mellipse(-0.45, -1.5, 5.7, 0.22, 0.15, mCyan);
  mellipse(0.45, -1.5, 5.7, 0.22, 0.15, mCyan);
  // nostril wings
  mline([[-0.7,-1.0,5.8],[-0.85,-1.5,5.6],[-0.7,-1.9,5.4]], mCyan);
  mline([[0.7,-1.0,5.8],[0.85,-1.5,5.6],[0.7,-1.9,5.4]], mCyan);
  // LIPS — volume (upper protrudes, mouth recessed, lower protrudes)
  // upper lip (z=5.4, full)
  mline([[-1.6,-2.6,5.2],[-1.0,-2.4,5.35],[-0.3,-2.3,5.4],[0,-2.35,5.42],[0.3,-2.3,5.4],[1.0,-2.4,5.35],[1.6,-2.6,5.2]], mGold);
  // mouth line (recessed, z=5.0)
  mline([[-1.5,-2.9,5.0],[-0.8,-3.05,5.05],[0,-3.0,5.08],[0.8,-3.05,5.05],[1.5,-2.9,5.0]], mCyan);
  // lower lip (z=5.5, fullest)
  mline([[-1.3,-3.2,5.3],[-0.7,-3.5,5.5],[0,-3.6,5.55],[0.7,-3.5,5.5],[1.3,-3.2,5.3]], mGold);
  // chin (recessed below lip, then jaw)
  mline([[-1.0,-4.2,5.2],[-0.4,-4.6,5.3],[0,-4.7,5.35],[0.4,-4.6,5.3],[1.0,-4.2,5.2]], mCyan);
  // jaw — mannequin smooth
  mline([[-4.5,1.5,3.5],[-3.8,-1,4.2],[-2.5,-3.5,4.6],[-1,-4.5,4.8],[0,-4.8,4.9]], mCyan);
  mline([[0,-4.8,4.9],[1,-4.5,4.8],[2.5,-3.5,4.6],[3.8,-1,4.2],[4.5,1.5,3.5]], mCyan);
  // NECK — mannequin column
  for(var nk=0; nk<6; nk++){
    var ny = -5 - nk*1.5, nr = 2.2 - nk*0.08;
    var npts=[];
    for(var na=0; na<=20; na++){ var nang=(na/20)*Math.PI*2;
      npts.push([Math.cos(nang)*nr, ny, Math.sin(nang)*nr*0.9]);
    }
    mline(npts, nk%2?mGold:mCyan);
  }
  // BASE — mannequin stand
  mellipse(0, -14.5, 0, 3.5, 0.6, mGold);
  mline([[0,-14.5,0],[0,-18,0]], mGold);
  mellipse(0, -18, 0, 5, 1.0, mGold);

  mg.position.set(20, 18, -20);
  scene.add(mg);
})();
// MANNEQUIN 2 — clean, minimal (King: so much scribbles, try new one)
(function(){ return; // BLACKOUT
  var g2 = new THREE.Group();
  var cC = new THREE.LineBasicMaterial({color:0x66eeff, transparent:true, opacity:0.9});
  var cG = new THREE.LineBasicMaterial({color:0xffcc44, transparent:true, opacity:0.9});
  function L(pts, mat){
    g2.add(new THREE.Line(new THREE.BufferGeometry().setFromPoints(pts.map(function(p){
      return new THREE.Vector3(p[0],p[1],p[2]); })), mat));
  }
  // CRANIUM — 6 meridians only
  for(var i=0; i<6; i++){
    var a=(i/6)*Math.PI*2, pts=[];
    for(var j=0;j<=10;j++){ var ph=(j/10)*Math.PI, r=5*Math.sin(ph);
      pts.push([Math.cos(a)*r, 5*Math.cos(ph)+2, Math.sin(a)*r*0.92]);
    }
    L(pts, i%2?cG:cC);
  }
  // 3 latitude rings
  for(var k=0;k<3;k++){ var ly=5-k*2.5, lr=5*Math.sqrt(Math.max(0,1-Math.pow((ly-2)/5,2))), rp=[];
    for(var n=0;n<=20;n++){ var an=(n/20)*Math.PI*2; rp.push([Math.cos(an)*lr, ly, Math.sin(an)*lr*0.92]); }
    L(rp, k%2?cC:c