<!-- RUBY-BACKUP · part 359 -->
   function M(geo, mat, x, y, z){
      var m = new THREE.Mesh(geo, mat);
      m.position.set(x, y, z);
      g.add(m);
      return m;
    }
    /* HEAD */
    M(new THREE.SphereGeometry(0.9, 20, 16), skin, 0, 7.5, 0).name='head';
    /* eyes */
    M(new THREE.SphereGeometry(0.14, 10, 8), eyeW, -0.32, 7.6, 0.78);
    M(new THREE.SphereGeometry(0.14, 10, 8), eyeW, 0.32, 7.6, 0.78);
    M(new THREE.SphereGeometry(0.06, 8, 6), pupil, -0.32, 7.6, 0.9);
    M(new THREE.SphereGeometry(0.06, 8, 6), pupil, 0.32, 7.6, 0.9);
    /* nose */
    M(new THREE.ConeGeometry(0.1, 0.35, 8), darkSkin, 0, 7.35, 0.9).rotation.x = Math.PI/2;
    /* mouth */
    var mouth = M(new THREE.BoxGeometry(0.4, 0.06, 0.05), new THREE.MeshStandardMaterial({color:0x8a3a3a}), 0, 7.05, 0.85);
    /* ears */
    M(new THREE.SphereGeometry(0.15, 8, 6), skin, -0.92, 7.5, 0);
    M(new THREE.SphereGeometry(0.15, 8, 6), skin, 0.92, 7.5, 0);
    /* hair */
    var hair = M(new THREE.SphereGeometry(0.95, 20, 16, 0, Math.PI*2, 0, Math.PI/2.2), hairM, 0, 7.65, -0.05);
    /* NECK */
    M(new THREE.CylinderGeometry(0.3, 0.35, 0.6, 10), skin, 0, 6.4, 0).name='neck';
    /* TORSO — chest and abdomen */
    M(new THREE.CylinderGeometry(0.85, 0.65, 1.8, 14), clothM, 0, 5.2, 0).name='chest';
    M(new THREE.CylinderGeometry(0.65, 0.55, 1.2, 12), darkSkin, 0, 3.7, 0).name='abdomen';
    /* shoulders */
    M(new THREE.SphereGeometry(0.35, 10, 8), clothM, -1.0, 5.9, 0);
    M(new THREE.SphereGeometry(0.35, 10, 8), clothM, 1.0, 5.9, 0);
    /* ARMS — upper, elbow, forearm, wrist, hand, fingers */
    [-1, 1].forEach(function(s){
      var sx = s*1.0;
      M(new THREE.CylinderGeometry(0.22, 0.2, 1.4, 10), skin, sx+s*0.15, 5.0, 0).name='upperarm';
      M(new THREE.SphereGeometry(0.2, 8, 6), darkSkin, sx+s*0.2, 4.25, 0).name='elbow';
      M(new THREE.CylinderGeometry(0.18, 0.15, 1.3, 10), skin, sx+s*0.22, 3.5, 0).name='forearm';
      M(new THREE.CylinderGeometry(0.14, 0.14, 0.25, 8), darkSkin, sx+s*0.23, 2.8, 0).name='wrist';
      var hand = M(new THREE.BoxGeometry(0.35, 0.5, 0.18), skin, sx+s*0.23, 2.45, 0);
      hand.name='hand';
      /* fingers — 4 + thumb */
      for(var f=0; f<4; f++){
        M(new THREE.CylinderGeometry(0.045, 0.04, 0.35, 6), skin, sx+s*0.23-0.12+f*0.08, 2.1, 0).name='finger';
      }
      var thumb = M(new THREE.CylinderGeometry(0.05, 0.045, 0.3, 6), skin, sx+s*0.23+s*0.2, 2.5, 0.05);
      thumb.rotation.z = s*0.6; thumb.name='thumb';
    });
    /* HIPS */
    M(new THREE.CylinderGeometry(0.6, 0.55, 0.8, 12), clothM, 0, 2.7, 0).name='hips';
    /* LEGS — thigh, knee, shin, ankle, foot, toes */
    [-1, 1].forEach(function(s){
      var lx = s*0.35;
      M(new THREE.CylinderGeometry(0.28, 0.24, 1.6, 10), skin, lx, 1.7, 0).name='thigh';
      M(new THREE.SphereGeometry(0.24, 8, 6), darkSkin, lx, 0.85, 0).name='knee';
      M(new THREE.CylinderGeometry(0.22, 0.18, 1.4, 10), skin, lx, 0.1, 0).name='shin';
      M(new THREE.CylinderGeometry(0.16, 0.16, 0.2, 8), darkSkin, lx, -0.65, 0).name='ankle';
      var foot = M(new THREE.BoxGeometry(0.35, 0.25, 0.8), darkSkin, lx, -0.8, 0.2);
      foot.name='foot';
      /* toes */
      for(var t=0; t<3; t++){
        M(new THREE.SphereGeometry(0.06, 6, 5), skin, lx-0.1+t*0.1, -0.85, 0.62).name='toe';
      }
    });
    g.position.set(-12, 0.9, -24);
    /* avatar size — we are avatars */
    g.scale.set(0.4, 0.4, 0.4);
    if(typeof scene!=='undefined') scene.add(g);
    window._humanBody = g;
    codeStatus('a body stands — avatar size');
  }catch(e){ codeStatus('body failed'); }
}
/* INTAGLIO — ultra-dense linework texture, engraved in 3D */
function makeIntaglioTexture(){
  try{
    var cv = document.createElement('canvas');
    cv.width = 512; cv.height = 512;
    var ctx = cv.getContext('2d');
    ctx.fillStyle = '#ffffff';
    ctx.fillRect(0, 0, 512, 512);
    /* dense hatch lines — the engraver's hand */
    ctx.strokeStyle = 'rgba(0,0,0,0.35)';
    ctx.lineWidth = 1;
    for(var y=0; y<512; y+=3){
      ctx.beginPath();
      ctx.moveTo(0, y);
      /* slight wave for organic feel */
      for(var x=0; x<=512; x+=16){
        ctx.lineTo(x, y + Math.sin(x*0.05+y*0.1)*2);
      }
      ctx.stroke();
    }
    /* cross-hatch for depth */
    ctx.strokeStyle = 'rgba(0,0,0,0.18)';
    for(var d=-512; d<512; d+=6){
      ctx.beginPath();
      ctx.moveTo(d, 0);
      ctx.lineTo(d+512, 512);
      ctx.stroke();
    }
    var tex = new THREE.CanvasTexture(cv);
    tex.wrapS = tex.wrapT = THREE.RepeatWrapping;
    return tex;
  }catch(e){ return null; }
}
/* EYES — the shape of eyes and eyelids, intaglio linework in 3D */
function buildIntaglioEyes(){
  try{
    var g = new THREE.Group();
    var intaglio = makeIntaglioTexture();
    var skinMat = new THREE.MeshStandardMaterial({color:0xc8966a, roughness:0.7, map:intaglio});
    var whiteMat = new THREE.MeshStandardMaterial({color:0xf5f0e8, roughness:0.25, map:intaglio});
    var irisMat = new THREE.Me