<!-- RUBY-BACKUP · part 112 -->
r l=0; l<7; l++){
        var la = (l/6 - 0.5) * 1.2;
        var lash = new THREE.Mesh(new THREE.CylinderGeometry(0.015, 0.008, 0.25, 4), lashMat);
        lash.position.set(ex + Math.sin(la)*0.55, 0.45 + Math.cos(la*0.5)*0.1, 0.35);
        lash.rotation.z = -la*0.5;
        lash.rotation.x = 0.4;
        lash.name = 'lash';
        g.add(lash);
      }
      /* brow ridge */
      var brow = new THREE.Mesh(new THREE.TorusGeometry(0.7, 0.09, 8, 16, Math.PI), skinMat);
      brow.position.set(ex, 0.75, 0.15);
      brow.rotation.x = -0.3;
      brow.name = 'brow';
      g.add(brow);
    });
    /* bridge of nose between */
    var bridge = new THREE.Mesh(new THREE.BoxGeometry(0.5, 1.2, 0.4), skinMat);
    bridge.position.set(0, -0.1, -0.15);
    bridge.name = 'nose-bridge';
    g.add(bridge);
    g.position.set(0, 3, -28);
    if(typeof scene!=='undefined') scene.add(g);
    window._intaglioEyes = g;
    codeStatus('eyes open — intaglio');
  }catch(e){ codeStatus('eyes failed'); }
}
/* BODY PAINT — draw intaglio anatomical detail on block-built parts */
function makeBodyTexture(part){
  try{
    var cv = document.createElement('canvas');
    cv.width = 256; cv.height = 256;
    var ctx = cv.getContext('2d');
    /* base skin */
    var grad = ctx.createLinearGradient(0, 0, 0, 256);
    grad.addColorStop(0, '#d8a878');
    grad.addColorStop(1, '#b8825a');
    ctx.fillStyle = grad;
    ctx.fillRect(0, 0, 256, 256);
    ctx.strokeStyle = 'rgba(60,30,10,0.4)';
    ctx.lineWidth = 1;
    if(part==='muscle'){
      /* muscle striations — flowing lines */
      for(var i=0; i<40; i++){
        ctx.beginPath();
        var y0 = Math.random()*256;
        ctx.moveTo(0, y0);
        for(var x=0; x<=256; x+=16){
          ctx.lineTo(x, y0 + Math.sin(x*0.05 + i)*12);
        }
        ctx.stroke();
      }
    }else if(part==='skin'){
      /* fine skin texture — dense dots and short lines */
      for(var d=0; d<800; d++){
        ctx.fillStyle = 'rgba(60,30,10,'+(Math.random()*0.15)+')';
        ctx.fillRect(Math.random()*256, Math.random()*256, 1.5, 1.5);
      }
      for(var s=0; s<60; s++){
        ctx.beginPath();
        var sx = Math.random()*256, sy = Math.random()*256;
        ctx.moveTo(sx, sy);
        ctx.lineTo(sx + (Math.random()-0.5)*20, sy + (Math.random()-0.5)*20);
        ctx.stroke();
      }
    }else if(part==='joint'){
      /* joint creases — concentric arcs */
      for(var r2=10; r2<120; r2+=12){
        ctx.beginPath();
        ctx.arc(128, 128, r2, 0, Math.PI*2);
        ctx.strokeStyle = 'rgba(60,30,10,'+(0.3 - r2*0.002)+')';
        ctx.stroke();
      }
    }
    /* intaglio hatch overlay */
    ctx.strokeStyle = 'rgba(0,0,0,0.12)';
    for(var h=0; h<256; h+=4){
      ctx.beginPath(); ctx.moveTo(0, h); ctx.lineTo(256, h); ctx.stroke();
    }
    var tex = new THREE.CanvasTexture(cv);
    tex.wrapS = tex.wrapT = THREE.RepeatWrapping;
    return tex;
  }catch(e){ return null; }
}
function paintBodyParts(){
  try{
    var body = window._humanBody;
    if(!body){ try{ codeStatus('Build a body first — type body.'); }catch(e){} return; }
    var muscleTex = makeBodyTexture('muscle');
    var skinTex = makeBodyTexture('skin');
    var jointTex = makeBodyTexture('joint');
    var painted = 0;
    body.traverse(function(o){
      if(!o.isMesh) return;
      var n = (o.name||'').toLowerCase();
      var tex = skinTex;
      if(n.indexOf('thigh')>=0||n.indexOf('upperarm')>=0||n.indexOf('chest')>=0||n.indexOf('abdomen')>=0) tex = muscleTex;
      if(n.indexOf('elbow')>=0||n.indexOf('knee')>=0||n.indexOf('wrist')>=0||n.indexOf('ankle')>=0) tex = jointTex;
      if(o.material && tex){
        o.material.map = tex;
        o.material.needsUpdate = true;
        painted++;
      }
    });
    codeStatus('painted ' + painted + ' parts — intaglio anatomy');
  }catch(e){ codeStatus('paint failed'); }
}
/* SOLID HAND — the solid of reality, built for the wrap */
function buildSolidHand(){
  try{
    var g = new THREE.Group();
    var skinMat = new THREE.MeshStandardMaterial({color:0xc8966a, roughness:0.6});
    /* palm — the solid base */
    var palm = new THREE.Mesh(new THREE.BoxGeometry(2.2, 2.8, 0.9), skinMat);
    palm.position.set(0, 0, 0);
    palm.name = 'palm';
    g.add(palm);
    /* knuckle mounds */
    for(var k=0; k<4; k++){
      var kn = new THREE.Mesh(new THREE.SphereGeometry(0.28, 10, 8), skinMat);
      kn.position.set(-0.75 + k*0.5, 1.55, 0);
      kn.name = 'knuckle';
      g.add(kn);
    }
    /* fingers — 3 segments each for articulation */
    var fingerX = [-0.75, -0.25, 0.25, 0.75];
    var fingerLen = [1.0, 1.15, 1.05, 0.85];
    for(var f=0; f<4; f++){
      var fx = fingerX[f];
      var fl = fingerLen[f];
      /* proximal */
      var p1 = new THREE.Mesh(new THREE.CylinderGeometry(0.16, 0.15, fl*0.45, 8), skinMat);
      p1.position.set(fx, 1.4 + fl*0.22, 0);
      p1.name = 'finger-proximal';
      g.add(p1);
      /* middle */
      var p2