component
STM32F103C8T6 - Arm Cortex-M3 MCU (Blue Pill)
Public Made by Adomby adom
STMicroelectronics mainstream Arm Cortex-M3 MCU. 72 MHz, 64 KB Flash, 20 KB SRAM, USB, CAN, LQFP-48. The workhorse Blue Pill microcontroller.
← Commit history
3d viewer: disable the cast shadow (reads as a baked smudge); demo choreography = chip up, solder off/on, then place
1 file changed
+32−13
viewers/3d.html+32−13@@ -41553,8 +41553,15 @@ function seatSolder(s){ if(gap>0){ sol.forEach(function(m){ try{var p=m.getAbsolutePosition(); m.setAbsolutePosition(new B.Vector3(p.x,p.y,p.z-gap*1.05));}catch(_){} }); } }catch(_){} }+// a chip sits flush on its board; the fixed-light cast shadow reads as a baked smudge, so drop it+function disableShadows(s){+ try{ s.lights&&s.lights.forEach(function(l){ l.shadowEnabled=false; }); }catch(_){}+ try{ var sg=v.getShadowGenerator&&v.getShadowGenerator(); if(sg&&sg.getShadowMap&&sg.getShadowMap()) sg.getShadowMap().renderList=[]; }catch(_){}+ try{ (s.meshes||[]).forEach(function(m){ m.receiveShadows=false; }); }catch(_){}+} function onReady(s){ seatSolder(s);+ disableShadows(s); try{ if(MARKS && MARKS.length) addEtch(s, MARKS); }catch(_){} // layer toggles by part name (fr4 / copper / solder_paste / LQFP-chip) [].slice.call(document.querySelectorAll('.lyrtog')).forEach(function(b){@@ -41566,6 +41573,11 @@ function onReady(s){ var pb=document.getElementById('play'); if(pb) pb.addEventListener('click',function(){ playLifecycle(s); }); var rb=document.getElementById('reset'); if(rb) rb.addEventListener('click',function(){ try{v.goHome&&v.goHome();}catch(_){} }); if((location.hash||'').indexOf('play')>=0) setTimeout(function(){playLifecycle(s);},500);+ if((location.hash||'').indexOf('low')>=0){ try{var c=v.getCamera(); if(c){c.beta=1.46; c.radius=c.radius*0.32;}}catch(_){} }+ if((location.hash||'').indexOf('demo')>=0){+ try{var c=v.getCamera(); if(c){c.beta=1.08; c.radius=c.radius*0.9;}}catch(_){}+ var reps=6,i=0; (function loop(){ if(i++>=reps)return; playLifecycle(s); setTimeout(loop,7200); })();+ } } // ---- laser-etch the MPN onto the chip top (world up is +Z) ----@@ -41602,22 +41614,29 @@ function playLifecycle(s){ if(animing||!B.Vector3)return; animing=true; var pb=document.getElementById('play'); if(pb)pb.disabled=true; var chip=byName(s,RE.chip), sol=byName(s,RE.solder);+ var solBtn=document.querySelector('.lyrtog[data-mesh="solder"]'); var cb=boundsOf(chip); var lift=cb?Math.max(cb.hi.x-cb.lo.x, cb.hi.y-cb.lo.y)*0.9:0.006; // ~ one chip-width, along +Z chip.forEach(function(m){ if(!m.__oz){m.computeWorldMatrix(true); m.__op=m.getAbsolutePosition().clone(); m.__oz=1;} }); function place(f){ chip.forEach(function(m){ try{m.setAbsolutePosition(new B.Vector3(m.__op.x, m.__op.y, m.__op.z+lift*f));}catch(_){} }); }- // solder stays on the board the whole time; the chip lifts and descends onto it- place(1);- var t0=performance.now(), DUR=3200;- (function step(now){- var t=(now-t0)/DUR; if(t>1)t=1;- var a=Math.min(1,t/0.5), ease=1-Math.pow(1-a,3);- place(1-ease); // chip descends onto the solder- // reflow: as the leads meet the solder (chip nearly seated), heat glow on solder + chip- if(t>=0.5&&t<0.8){ var g=Math.sin((t-0.5)/0.3*Math.PI); setEmis(sol,0.95*g,0.32*g,0); setEmis(chip,0.35*g,0.1*g,0); }- else if(t>=0.8){ var p=Math.sin((t-0.8)/0.2*Math.PI); setEmis(chip,0,0.5*p,0.48*p); setEmis(sol,0,0,0); } // power-on pulse- if(t<1) requestAnimationFrame(step);- else { place(0); setEmis(chip,0,0,0); setEmis(sol,0,0,0); animing=false; if(pb)pb.disabled=false; }- })(t0);+ function solOn(on){ sol.forEach(function(m){m.setEnabled(on);}); if(solBtn)solBtn.classList.toggle('on',on); }+ // 1) chip starts lifted (so you can see the pads/solder); solder on+ place(1); solOn(true);+ // 2) show the solder layer: toggle it off, then back on+ setTimeout(function(){ solOn(false); }, 1100);+ setTimeout(function(){ solOn(true); }, 2400);+ // 3) lower the chip onto the solder, then reflow heat-glow + power-on pulse+ setTimeout(function(){+ var t0=performance.now(), DUR=1700;+ (function step(now){+ var t=(now-t0)/DUR; if(t>1)t=1;+ var ease=1-Math.pow(1-t,3);+ place(1-ease);+ if(t>=0.55&&t<0.85){ var g=Math.sin((t-0.55)/0.3*Math.PI); setEmis(sol,0.95*g,0.32*g,0); setEmis(chip,0.35*g,0.1*g,0); }+ else if(t>=0.85){ var p=Math.sin((t-0.85)/0.15*Math.PI); setEmis(chip,0,0.5*p,0.48*p); setEmis(sol,0,0,0); }+ if(t<1) requestAnimationFrame(step);+ else { place(0); setEmis(chip,0,0,0); setEmis(sol,0,0,0); animing=false; if(pb)pb.disabled=false; }+ })(t0);+ }, 3500); } // cross-highlight bus: 3D joins as a listener (per-lead highlight needs named leads)