<!-- SAGA2 · part 84 -->
e++){
      var pts=[];
      for(var i=0;i<=16;i++){ var an=i/16*Math.PI*2;
        pts.push(new THREE.Vector3(sd*2.3+Math.cos(an)*(1.6+e*0.45), 0.8+Math.sin(an)*(1.2+e*0.35), 5.6-e*0.15)); }
      draw(pts, lnDim, headGrp);
    }
    // brow shadow — cross-hatch (dense, dark)
    for(var bs=0; bs<6; bs++){
      var pts=[];
      for(var i=0;i<=10;i++){ var t=i/10;
        pts.push(new THREE.Vector3(sd*(1.0+t*2.5), 2.0-bs*0.18, 5.9-bs*0.05)); }
      draw(pts, lnCyan, headGrp);
      // cross layer
      var pts2=[];
      for(var i=0;i<=10;i++){ var t=i/10;
        pts2.push(new THREE.Vector3(sd*(1.2+t*2.2), 2.1-bs*0.18+t*0.5, 5.85-bs*0.05)); }
      draw(pts2, lnDim, headGrp);
    }
  });
  // nose ridge
  for(var n=-2;n<=2;n++){ var pts=[];
    for(var i=0;i<=8;i++){ var t=i/8; pts.push(new THREE.Vector3(n*0.35, 1.5-t*4.0, 6.0-t*0.3+Math.abs(n)*0.2)); }
    draw(pts, lnDim, headGrp);
  }
  // NEW MOUTH — defined lips
  // upper lip (M shape)
  var umpts=[];
  for(var i=0;i<=20;i++){ var t=i/20;
    var x = -2.5+t*5.0;
    var y = -2.8+Math.sin(t*Math.PI)*-0.6+Math.sin(t*Math.PI*2)*0.2;
    var z = 5.6+Math.sin(t*Math.PI)*0.5;
    umpts.push(new THREE.Vector3(x, y, z));
  }
  draw(umpts, lnGold, headGrp);
  draw(umpts, lnGold, headGrp);
  draw(umpts, lnWhite, headGrp);
  // lower lip (fuller)
  var lmpts=[];
  for(var i=0;i<=20;i++){ var t=i/20;
    var x = -2.3+t*4.6;
    var y = -3.6+Math.sin(t*Math.PI)*0.4;
    var z = 5.5+Math.sin(t*Math.PI)*0.4;
    lmpts.push(new THREE.Vector3(x, y, z));
  }
  draw(lmpts, lnCyan, headGrp);
  // mouth shadow (depth)
  var smpts=[];
  for(var i=0;i<=16;i++){ var t=i/16;
    smpts.push(new THREE.Vector3(-2.0+t*4.0, -3.2+Math.sin(t*Math.PI)*-0.3, 5.75));
  }
  draw(smpts, lnWhite, headGrp);
  // NEW CHIN — defined anchor
  for(var chn=0; chn<4; chn++){
    var cpts=[];
    for(var i=0;i<=14;i++){ var t=i/14;
      var x = -2.0+t*4.0;
      var y = -4.2-chn*0.35+Math.sin(t*Math.PI)*-0.5;
      var z = 5.0+Math.sin(t*Math.PI)*0.6-chn*0.15;
      cpts.push(new THREE.Vector3(x, y, z));
    }
    draw(cpts, chn===0?lnGold:lnCyan, headGrp);
  }
  // NOSTRILS
  [-1,1].forEach(function(sd){
    var pts=[];
    for(var i=0;i<=10;i++){ var an=i/10*Math.PI*1.5;
      pts.push(new THREE.Vector3(sd*0.8+Math.cos(an)*0.5, -2.8+Math.sin(an)*0.4, 5.9)); }
    draw(pts, lnCyan, headGrp);
  });
  // (old mouth removed, new above)
  // EARS
  [-1,1].forEach(function(sd){
    for(var er2=0; er2<2; er2++){
      var pts=[];
      for(var i=0;i<=14;i++){ var an=i/14*Math.PI*2;
        pts.push(new THREE.Vector3(sd*5.4+Math.cos(an)*(0.7+er2*0.25), 0.2+Math.sin(an)*(1.0+er2*0.3), 1.6));
      }
      draw(pts, er2===1?lnGold:lnDim, headGrp);
    }
  });
  headGrp.position.set(0, 20, 2);
  avatarGrp.add(headGrp);
  avatarGrp.userData.head = headGrp;

  // ===== EYES — kept, SMALLER, on the face =====
  [-1,1].forEach(function(sd){
    var iris = new THREE.Mesh(new THREE.CircleGeometry(0.45, 16),
      new THREE.MeshBasicMaterial({color:0x66eeff}));
    iris.position.set(sd*2.3, 0.8, 6.15);
    headGrp.add(iris);
    var pupil = new THREE.Mesh(new THREE.CircleGeometry(0.18, 12),
      new THREE.MeshBasicMaterial({color:0x000000}));
    pupil.position.set(sd*2.3, 0.8, 6.2);
    headGrp.add(pupil);
    var eglow = new THREE.Mesh(new THREE.PlaneGeometry(1.6, 1.6),
      new THREE.MeshBasicMaterial({color:0x44ccff, transparent:true, opacity:0.3, blending:THREE.AdditiveBlending, depthWrite:false}));
    eglow.position.set(sd*2.3, 0.8, 6.1);
    headGrp.add(eglow);
  });
  // ===== TACTICAL VISOR — HUD across eyes =====
  var visorPts = [];
  for(var vi=0; vi<=20; vi++){
    var t = vi/20;
    visorPts.push(new THREE.Vector3(-4.5+t*9, 1.2+Math.sin(t*Math.PI)*0.3, 6.3));
  }
  draw(visorPts, lnGold, headGrp);
  var visorPts2 = [];
  for(var vi=0; vi<=20; vi++){
    var t = vi/20;
    visorPts2.push(new THREE.Vector3(-4.5+t*9, 0.2+Math.sin(t*Math.PI)*-0.2, 6.35));
  }
  draw(visorPts2, lnGold, headGrp);
  // targeting reticle — floating
  var retGrp = new THREE.Group();
  for(var rt=0; rt<4; rt++){
    var an = rt*Math.PI/2, pts=[];
    pts.push(new THREE.Vector3(Math.cos(an)*2.0, Math.sin(an)*2.0, 0));
    pts.push(new THREE.Vector3(Math.cos(an)*2.8, Math.sin(an)*2.8, 0));
    var g = new THREE.BufferGeometry().setFromPoints(pts);
    retGrp.add(new THREE.Line(g, lnGold));
  }
  var rcPts=[];
  for(var i=0;i<=24;i++){ var an=i/24*Math.PI*2; rcPts.push(new THREE.Vector3(Math.cos(an)*3.2, Math.sin(an)*3.2, 0)); }
  retGrp.add(new THREE.Line(new THREE.BufferGeometry().setFromPoints(rcPts), lnCyan));
  retGrp.position.set(0, 20, 12);
  avatarGrp.add(retGrp);
  avatarGrp.userData.reticle = retGrp;
  // comms antenna — from head
  var antPts=[];
  for(var ai=0; ai<=10; ai++){ antPts.push(new THREE.Vector3(5.5+ai*0.15, 22+ai*1.2, 0)); }
  draw(antPts, lnGold, avatarGrp);
  // antenna tip (blinking)
  var antTip = new THREE.Mesh(new THREE.SphereGeometry(0.3, 8, 8),
    new THREE.Me