Wireframe cube function for Laser Projector

Just a little something I wrote on a Saturday.

#       Tumbling Wireframe Cube with Hidden Line Removal

#                         By JRS_5150


#                     USE RECTANGULAR GRID

#        ADJUST GRID SIZE TO SUIT YOUR PERFORMANCE NEEDS





#Set Cube size
size = 20;

#Set color
s=1;
h=floor(time/2)*60;

#Set perspective
perspective=0.008;

#Set roll
roll=time/4;

#set pitch
pitch=time;

#Set yaw
yaw=time/10;


#Define vertices
x0=-1size;
y0=size;
z0=size;

x1=size;
y1=size;
z1=size;

x2=size;
y2=-1size;
z2=size;

x3=-1size;
y3=-1size;
z3=size;

x4=-1size;
y4=size;
z4=-1size;

x5=size;
y5=size;
z5=-1size;

x6=size;
y6=-1size;
z6=-1size;

x7=-1size;
y7=-1size;
z7=-1size;



#Apply roll

x0'=(x0*cos(roll))-(y0*sin(roll));
y0'=(x0*sin(roll))+(y0*cos(roll));

x0=x0';
y0=y0';

x1'=(x1*cos(roll))-(y1*sin(roll));
y1'=(x1*sin(roll))+(y1*cos(roll));

x1=x1';
y1=y1';

x2'=(x2*cos(roll))-(y2*sin(roll));
y2'=(x2*sin(roll))+(y2*cos(roll));

x2=x2';
y2=y2';

x3'=(x3*cos(roll))-(y3*sin(roll));
y3'=(x3*sin(roll))+(y3*cos(roll));

x3=x3';
y3=y3';

x4'=(x4*cos(roll))-(y4*sin(roll));
y4'=(x4*sin(roll))+(y4*cos(roll));

x4=x4';
y4=y4';

x5'=(x5*cos(roll))-(y5*sin(roll));
y5'=(x5*sin(roll))+(y5*cos(roll));

x5=x5';
y5=y5';

x6'=(x6*cos(roll))-(y6*sin(roll));
y6'=(x6*sin(roll))+(y6*cos(roll));

x6=x6';
y6=y6';

x7'=(x7*cos(roll))-(y7*sin(roll));
y7'=(x7*sin(roll))+(y7*cos(roll));

x7=x7';
y7=y7';


#Apply pitch
y0'=(y0*cos(pitch))-(z0*sin(pitch));
z0'=(y0*sin(pitch))+(z0*cos(pitch));

y0=y0';
z0=z0';

y1'=(y1*cos(pitch))-(z1*sin(pitch));
z1'=(y1*sin(pitch))+(z1*cos(pitch));

y1=y1';
z1=z1';

y2'=(y2*cos(pitch))-(z2*sin(pitch));
z2'=(y2*sin(pitch))+(z2*cos(pitch));

y2=y2';
z2=z2';

y3'=(y3*cos(pitch))-(z3*sin(pitch));
z3'=(y3*sin(pitch))+(z3*cos(pitch));

y3=y3';
z3=z3';

y4'=(y4*cos(pitch))-(z4*sin(pitch));
z4'=(y4*sin(pitch))+(z4*cos(pitch));

y4=y4';
z4=z4';

y5'=(y5*cos(pitch))-(z5*sin(pitch));
z5'=(y5*sin(pitch))+(z5*cos(pitch));

y5=y5';
z5=z5';

y6'=(y6*cos(pitch))-(z6*sin(pitch));
z6'=(y6*sin(pitch))+(z6*cos(pitch));

y6=y6';
z6=z6';

y7'=(y7*cos(pitch))-(z7*sin(pitch));
z7'=(y7*sin(pitch))+(z7*cos(pitch));

y7=y7';
z7=z7';


#Apply yaw
x0'=(x0*cos(yaw))-(z0*sin(yaw));
z0'=(x0*sin(yaw))+(z0*cos(yaw));

x0=x0';
z0=z0';

x1'=(x1*cos(yaw))-(z1*sin(yaw));
z1'=(x1*sin(yaw))+(z1*cos(yaw));

x1=x1';
z1=z1';

x2'=(x2*cos(yaw))-(z2*sin(yaw));
z2'=(x2*sin(yaw))+(z2*cos(yaw));

x2=x2';
z2=z2';

x3'=(x3*cos(yaw))-(z3*sin(yaw));
z3'=(x3*sin(yaw))+(z3*cos(yaw));

x3=x3';
z3=z3';

x4'=(x4*cos(yaw))-(z4*sin(yaw));
z4'=(x4*sin(yaw))+(z4*cos(yaw));

x4=x4';
z4=z4';

x5'=(x5*cos(yaw))-(z5*sin(yaw));
z5'=(x5*sin(yaw))+(z5*cos(yaw));

x5=x5';
z5=z5';

x6'=(x6*cos(yaw))-(z6*sin(yaw));
z6'=(x6*sin(yaw))+(z6*cos(yaw));

x6=x6';
z6=z6';

x7'=(x7*cos(yaw))-(z7*sin(yaw));
z7'=(x7*sin(yaw))+(z7*cos(yaw));

x7=x7';
z7=z7';

#Apply perspective projection
x0=x0*(1+(z0*perspective));
y0=y0*(1+(z0*perspective));

x1=x1*(1+(z1*perspective));
y1=y1*(1+(z1*perspective));

x2=x2*(1+(z2*perspective));
y2=y2*(1+(z2*perspective));

x3=x3*(1+(z3*perspective));
y3=y3*(1+(z3*perspective));

x4=x4*(1+(z4*perspective));
y4=y4*(1+(z4*perspective));

x5=x5*(1+(z5*perspective));
y5=y5*(1+(z5*perspective));

x6=x6*(1+(z6*perspective));
y6=y6*(1+(z6*perspective));

x7=x7*(1+(z7*perspective));
y7=y7*(1+(z7*perspective));


#Assign each laser to a line
line=(floor(index/floor(count/12)));

#Select vertices to draw a line between
vax=if(line==0|line==4,x0,0) + if(line==1|line==5,x1,0) + if(line==2|line==6,x2,0) + if(line==3|line==7,x3,0) + if(line==8,x4,0) + if(line==9,x5,0) + if(line==10,x6,0) + if(line==11,x7,0);


vay=if(line==0|line==4,y0,0) + if(line==1|line==5,y1,0) + if(line==2|line==6,y2,0) + if(line==3|line==7,y3,0) + if(line==8,y4,0) + if(line==9,y5,0) + if(line==10,y6,0) + if(line==11,y7,0);

vbx=if(line==0,x1,0) + if(line==1,x2,0) + if(line==2,x3,0) + if(line==3,x0,0) + if(line==4|line==11,x4,0) + if(line==5|line==8,x5,0) + if(line==6|line==9,x6,0) + if(line==7|line==10,x7,0);

vby=if(line==0,y1,0) + if(line==1,y2,0) + if(line==2,y3,0) + if(line==3,y0,0) + if(line==4|line==11,y4,0) + if(line==5|line==8,y5,0) + if(line==6|line==9,y6,0) + if(line==7|line==10,y7,0);


#Hide occluded lines using back-face culling


#Find out which faces are facing towards the camera by checking the winding order of the face's vertices. Faces with counter-clockwise winding orders will be culled.

f0=if(((x1-x0)*(y1+y0))+((x2-x1)*(y2+y1))+((x3-x2)*(y3+y2))+((x0-x3)*(y0+y3))>=0,1,0);

f1=if(((x5-x1)*(y5+y1))+((x6-x5)*(y6+y5))+((x2-x6)*(y2+y6))+((x1-x2)*(y1+y2))>=0,1,0);

f2=if(((x4-x5)*(y4+y5))+((x7-x4)*(y7+y4))+((x6-x7)*(y6+y7))+((x5-x6)*(y5+y6))>=0,1,0);

f3=if(((x0-x4)*(y0+y4))+((x3-x0)*(y3+y0))+((x7-x3)*(y7+y3))+((x4-x7)*(y4+y7))>=0,1,0);

f4=if(((x5-x4)*(y5+y4))+((x1-x5)*(y1+y5))+((x0-x1)*(y0+y1))+((x4-x0)*(y4+y0))>=0,1,0);

f5=if(((x2-x3)*(y2+y3))+((x6-x2)*(y6+y2))+((x7-x6)*(y7+y6))+((x3-x7)*(y3+y7))>=0,1,0);


#Count the number of unculled faces on each line. lines with no unculled faces will be removed.

l0=f0+f4;
l1=f0+f1;
l2=f0+f5;
l3=f0+f3;
l4=f3+f4;
l5=f1+f4;
l6=f1+f5;
l7=f3+f5;
l8=f2+f4;
l9=f1+f2;
la=f2+f5;
lb=f2+f3;


#Remove hidden lines

visible=if(line==0 & l0,1,0)+if(line==1 & l1,1,0)+if(line==2 & l2,1,0)+if(line==3 & l3,1,0)+if(line==4 & l4,1,0)+if(line==5 & l5,1,0)+if(line==6 & l6,1,0)+if(line==7 & l7,1,0)+if(line==8 & l8,1,0)+if(line==9 & l9,1,0)+if(line==10 & la,1,0)+if(line==11 & lb,1,0);

#Draw a line
x'=lerp((index%floor(count/12))/(floor(count/12)-1),vax,vbx);
y'=lerp((index%floor(count/12))/(floor(count/12)-1),vay,vby);

#Hide extra lasers
v=if(index>(floor(count/12)*12),0,visible);
7 Likes