<!-- SAGA2 · part 72 -->
r]);
    }
    L(pts, i%2?cG:cC);
  }
  // Brow line — wraps around ball at y=3 (Loomis)
  var brow=[];
  for(var b=0;b<=24;b++){ var ba=(b/24)*Math.PI*2;
    brow.push([Math.cos(ba)*5, 3, Math.sin(ba)*5]);
  }
  L(brow, cG);
  // Center line — vertical
  L([[0,8,5],[0,3,5.2],[0,0,5.5],[0,-3,5.0]], cG);
  // FACE PLANE — jaw from ears to chin
  L([[-5,3,2],[-4.5,0,4],[-3.5,-2.5,4.8],[-1.5,-4,5.0],[0,-4.5,5.1]], cC);
  L([[0,-4.5,5.1],[1.5,-4,5.0],[3.5,-2.5,4.8],[4.5,0,4],[5,3,2]], cC);
  // Features
  var ex=1.9;
  L([[-3.5,3.2,4.8],[-ex,3.5,5.0],[-0.8,3.2,5.1]], cG);
  L([[0.8,3.2,5.1],[ex,3.5,5.0],[3.5,3.2,4.8]], cG);
  L([[0,2.5,5.1],[0,1.0,5.6],[0,-0.5,6.0]], cG);
  L([[-0.8,1.5,5.2],[-0.9,0,5.7],[-0.8,-1.0,5.9]], cC);
  L([[0.8,1.5,5.2],[0.9,0,5.7],[0.8,-1.0,5.9]], cC);
  L([[-1.5,-2.5,5.2],[0,-2.7,5.3],[1.5,-2.5,5.2]], cG);
  L([[-1.3,-3.0,5.25],[0,-3.2,5.3],[1.3,-3.0,5.25]], cC);
  // Ears
  function ear(sx){
    var ep=[];
    for(var e=0;e<=12;e++){ var ea=(e/12)*Math.PI*2;
      ep.push([sx+Math.cos(ea)*0.6, 1.5+Math.sin(ea)*1.2, 1.5+Math.sin(ea)*0.3]);
    }
    L(ep, cC);
  }
  ear(-5); ear(5);
  // Neck
  for(var v=0;v<3;v++){ var vy=-5-v*2, vr=2.2, vp=[];
    for(var w=0;w<=16;w++){ var wa=(w/16)*Math.PI*2; vp.push([Math.cos(wa)*vr, vy, Math.sin(wa)*vr]); }
    L(vp, v%2?cG:cC);
  }
  g4.position.set(-60, 18, -20);
  g4.rotation.y = 0.5;
  scene.add(g4);
})();
// 20 PRACTICE HEADS — King: keep practicing, make 20 more
(function(){
  function buildPractice(idx, px, pz){
    var g = new THREE.Group();
    var cC = new THREE.LineBasicMaterial({color:0x66eeff, transparent:true, opacity:0.75});
    var cG = new THREE.LineBasicMaterial({color:0xffcc44, transparent:true, opacity:0.75});
    function L(pts, mat){
      g.add(new THREE.Line(new THREE.BufferGeometry().setFromPoints(pts.map(function(p){
        return new THREE.Vector3(p[0],p[1],p[2]); })), mat));
    }
    // variations
    var es = idx % 5, jw = Math.floor(idx/5) % 4;
    var eyeDX = 1.7 + es*0.25;
    var jawW = 3.0 + jw*0.5;
    var headR = 4.8 + (idx%3)*0.3;
    var rotY = (idx%3-1)*0.6; // -0.6, 0, 0.6 (profile, front, 3/4)
    // cranium — 6 meridians
    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=headR*Math.sin(ph);
        pts.push([Math.cos(a)*r, headR*Math.cos(ph)+2, Math.sin(a)*r*0.92]);
      }
      L(pts, i%2?cG:cC);
    }
    // brow line
    var br=[];
    for(var b=0;b<=16;b++){ var ba=(b/16)*Math.PI*2;
      br.push([Math.cos(ba)*headR*0.95, 2.5, Math.sin(ba)*headR*0.9]);
    }
    L(br, cG);
    // face
    L([[-eyeDX-1.5,3.5,4.2],[-eyeDX,3.7,4.5],[-0.8,3.4,4.6]], cG);
    L([[0.8,3.4,4.6],[eyeDX,3.7,4.5],[eyeDX+1.5,3.5,4.2]], cG);
    // eye sockets (indented)
    function sk(cx){
      var sp=[];
      for(var s2=0;s2<=12;s2++){ var sa=(s2/12)*Math.PI*2;
        sp.push([cx+Math.cos(sa)*1.1, 2.2+Math.sin(sa)*0.6, 4.0]);
      }
      L(sp, cC);
    }
    sk(-eyeDX); sk(eyeDX);
    // nose (protruding)
    L([[0,2.8,4.5],[0,1.0,5.2],[0,-0.5,5.8]], cG);
    L([[-0.8,1.5,4.7],[-0.9,0,5.3],[-0.8,-1.0,5.6]], cC);
    L([[0.8,1.5,4.7],[0.9,0,5.3],[0.8,-1.0,5.6]], cC);
    // mouth
    L([[-1.4,-2.2,4.9],[0,-2.4,5.0],[1.4,-2.2,4.9]], cG);
    // jaw
    L([[-jawW,1.0,3.0],[-jawW*0.7,-2.0,4.0],[0,-3.8,4.3]], cC);
    L([[0,-3.8,4.3],[jawW*0.7,-2.0,4.0],[jawW,1.0,3.0]], cC);
    g.position.set(px, 14, pz);
    g.rotation.y = rotY;
    scene.add(g);
  }
  // INTAGLIO HEAD — 35-year-old man, ultra-dense linework (King's order)
  (function(){
    var ig = new THREE.Group();
    var iC = new THREE.LineBasicMaterial({color:0x66eeff, transparent:true, opacity:0.55});
    var iG = new THREE.LineBasicMaterial({color:0xffcc44, transparent:true, opacity:0.55});
    var iD = new THREE.LineBasicMaterial({color:0x226688, transparent:true, opacity:0.35});
    // Ribbon materials (match line colors, for meshes)
    var riC=new THREE.MeshBasicMaterial({color:0x00cccc,transparent:true,opacity:0.55,side:THREE.DoubleSide});
    var riG=new THREE.MeshBasicMaterial({color:0xffcc44,transparent:true,opacity:0.55,side:THREE.DoubleSide});
    var riD=new THREE.MeshBasicMaterial({color:0x008888,transparent:true,opacity:0.35,side:THREE.DoubleSide});
    function L(pts, mat){
      // King: lines → ribbons (width 0.05)
      var rm=riC; if(mat===iG) rm=riG; else if(mat===iD) rm=riD;
      ig.add(ribbon(pts, 0.05, rm));
    }
    // CRANIUM — 12 meridians (cut bloat, keep form)
    for(var i=0;i<12;i++){ var a=(i/12)*Math.PI*2, pts=[];
      for(var j=0;j<=16;j++){ var ph=(j/16)*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%3==0?iG:iC);
    }
    // CRANIUM — 10 latitude rings (skip front face, no grid over face)
    for(var k=0;k<10;k++){ var ly=7-k*1.4, lr=5*Math.sqrt(Math.max(0,1-Math.pow((ly-2)/5,2)));
      // Draw back 270 degrees only (skip front 90 where face is)
      var rp1=[