dispw = 80; casew = 200; caseh = 100; cased = 20; caseb = 10; caset = 5; keyw = 60; keyh = 18; keyd = 2; keyb = 8; keym = 10; kdis = 1.5; shouldw = 60; shouldr = 8; keyspace = 20; dia = 12; raise_hand = 20; udist = 10; module display() { translate([0,0,cased/2]) rcube(dispw,dispw,2,4); } module rcube(w,h,d,b) { translate([-w/2,-h/2,-d/2]) hull() { translate([b,b,0]) cylinder(r=b, h=d); translate([b,h-b,0]) cylinder(r=b, h=d); translate([w-b,b,0]) cylinder(r=b, h=d); translate([w-b,h-b,0]) cylinder(r=b, h=d); } } module antenna() { translate([shouldr-shouldw/2,0,0]) scale([1,.5,1]) hull() { sphere(r=shouldr); translate([shouldw-2*shouldr,0,0]) sphere(r=shouldr); } } module dx07s024jj2() { cube(size=[8.94, 8.17, 3.14], center=true); } module blkcd1c64gk() { color([.3,.3,.3]) cube(size=[94.5, 55, 5], center=true); color([1,1,1]) translate([0,0,2.5]) text("Intel BLKCD1P64GK", halign="center", valign="center", font="PragmataPro", size=8); } module button() { linear_extrude(height=2) circle(r=dia/2); } module gamepad(n, d) { button(); for(i=[0:n]) rotate(i*360/n) translate([d,0]) button(); } module bar() { for(i=[0:2]) for(j=[0:1]) translate([i*18,j*18,0]) rcube(16,16,2,2); } module face_buttons() { translate([-70, raise_hand]) gamepad(4, 14); translate([70, raise_hand]) rotate(90) gamepad(6, 16); translate([52, -32]) bar(); translate([-52 - 2*18, -32]) bar(); } module buttons() { translate([0,0,cased/2+.5]) face_buttons(); translate([0, -1.5 * keyspace]) for (f=[0:3]) { translate([(keyw-casew)/2 + keym, f*keyspace, -cased/2 - kdis]) rcube(keyw,keyh,keyd,keyb); translate([(casew-keyw)/2 - keym, f*keyspace, -cased/2 - kdis]) rcube(keyw,keyh,keyd,keyb); } } module box() { // Case color([0,1,0]) rcube(casew, caseh, cased, caseb); color([.25,.25,.25]) display(); for(s=[-1,1]) for(p=[-1,1]) { translate([p*udist, caseh/2*s]) dx07s024jj2(); translate([casew/2*s, p*udist]) rotate(90) dx07s024jj2(); } color([1,0,1]) buttons(); for(i=[-1,1]) color([0,0,1]) translate([i * ((casew-keyw)/2 - keym), caseh/2,0]) antenna(); } translate([0, 60, 0]) box(); translate([0, -60, 0]) rotate([180]) box(); translate([-160, 0, 0]) rotate(90) box(); translate([160, 0, 0]) rotate(-90) box(); translate([180, 0, 13]) rotate(-90) blkcd1c64gk();