<!-- RUBY-BACKUP · part 530 -->
 a.download = 'creator-model.obj';
    document.body.appendChild(a);
    a.click();
    document.body.removeChild(a);
    URL.revokeObjectURL(url);
    codeStatus('exported OBJ — share it');
  }catch(e){ codeStatus('export failed'); }
}
/* ORGANIC SCULPT MODE — Playa 2.0 spec, blessed */
/* Smooth / Sharpen / Bend brushes, vertex displacement along normals */
var _sculptOpen = false;
var _sculptBrush = 'smooth';
var _sculptIntensity = 0.3;
function toggleSculptMode(){
  _sculptOpen = !_sculptOpen;
  var sm = document.getElementById('sculptPanel');
  if(_sculptOpen){
    var target = window._highlighted || window._selectedBlock;
    if(!target){ codeStatus('tap a block first, then sculpt'); _sculptOpen = false; return; }
    if(!sm){
      sm = document.createElement('div');
      sm.id = 'sculptPanel';
      sm.style.cssText = 'position:fixed;bottom:80px;left:50%;transform:translateX(-50%);z-index:15000;background:rgba(10,8,4,0.92);border:2px solid #ffd700;border-radius:16px;padding:12px;display:flex;flex-direction:column;gap:10px;max-width:94vw;';
      sm.innerHTML = '<div style="color:#ffd700;font-family:monospace;font-size:13px;text-align:center;">SCULPT — digital clay</div>'
        + '<div style="display:flex;gap:8px;justify-content:center;">'
        + '<button data-brush="smooth" style="sculptbtn">🌊 Smooth</button>'
        + '<button data-brush="sharpen" style="sculptbtn">⚡ Sharpen</button>'
        + '<button data-brush="bend" style="sculptbtn">🌀 Bend</button>'
        + '</div>'
        + '<div style="display:flex;gap:8px;justify-content:center;align-items:center;">'
        + '<span style="color:#888;font-size:11px;">POWER</span>'
        + '<input id="sculptPower" type="range" min="0.05" max="1" step="0.05" value="0.3" style="flex:1;accent-color:#ffd700;">'
        + '</div>'
        + '<div style="display:flex;gap:8px;justify-content:center;">'
        + '<button id="sculptApply" style="flex:1;background:#ffd700;color:#111;border:none;border-radius:8px;padding:12px;font-size:16px;cursor:pointer;font-weight:bold;">Apply</button>'
        + '<button id="sculptClose" style="background:#333;color:#fff;border:none;border-radius:8px;padding:12px 20px;font-size:16px;cursor:pointer;">X</button>'
        + '</div>';
      var st = document.createElement('style');
      st.textContent = '[data-brush]{background:#1a1a1a;color:#ffd700;border:1px solid #ffd700;border-radius:8px;padding:12px 16px;font-size:14px;cursor:pointer;} [data-brush].active{background:#ffd700;color:#111;}';
      document.head.appendChild(st);
      document.body.appendChild(sm);
      sm.querySelectorAll('[data-brush]').forEach(function(b){
        b.onclick = function(){
          sm.querySelectorAll('[data-brush]').forEach(function(x){ x.classList.remove('active'); });
          b.classList.add('active');
          _sculptBrush = b.getAttribute('data-brush');
        };
      });
      sm.querySelector('[data-brush="smooth"]').classList.add('active');
      document.getElementById('sculptPower').oninput = function(){ _sculptIntensity = parseFloat(this.value); };
      document.getElementById('sculptApply').onclick = function(){ applySculpt(); };
      document.getElementById('sculptClose').onclick = function(){ toggleSculptMode(); };
    }else{
      sm.style.display = 'flex';
    }
    codeStatus('sculpt mode — ' + _sculptBrush);
  }else if(sm){
    sm.style.display = 'none';
    codeStatus('sculpt closed');
  }
}
function applySculpt(){
  try{
    var target = window._highlighted || window._selectedBlock;
    if(!target){ codeStatus('no block selected'); return; }
    var brush = _sculptBrush;
    var power = _sculptIntensity;
    // snapshot for undo
    var snapshots = [];
    target.traverse(function(m){
      if(m.isMesh && m.geometry && m.geometry.attributes && m.geometry.attributes.position){
        var pos = m.geometry.attributes.position;
        var orig = new Float32Array(pos.array);
        snapshots.push({mesh:m, orig:orig});
        var norm = m.geometry.attributes.normal;
        for(var i=0; i<pos.count; i++){
          var nx = norm ? norm.getX(i) : 0, ny = norm ? norm.getY(i) : 1, nz = norm ? norm.getZ(i) : 0;
          var px = pos.getX(i), py = pos.getY(i), pz = pos.getZ(i);
          if(brush==='smooth'){
            // pull toward center (smooth)
            pos.setXYZ(i, px - nx*power*0.1, py - ny*power*0.1, pz - nz*power*0.1);
          }else if(brush==='sharpen'){
            // push along normal (sharpen)
            pos.setXYZ(i, px + nx*power*0.2, py + ny*power*0.2, pz + nz*power*0.2);
          }else if(brush==='bend'){
            // curve: displace by sine of position
            var bend = Math.sin(px*2 + py*2) * power * 0.3;
            pos.setXYZ(i, px + nx*bend, py + ny*bend, pz + nz*bend);
          }
        }
        pos.needsUpdate = true;
        m.geometry.computeVertexNormals();
      }
    });
    pushCommand({
      name: 'sculpt ' + brush,
      exe