boxCollection boxes[][][]; int numBoxes,maxBoxes; float angle1, angle2, da1, da2; palette pal; void setup(){ pal = new palette(256,100,"color02.gif"); size(600,600,P3D); background(255); numBoxes=5; maxBoxes=10; boxes=new boxCollection[2][2][2]; for(int i=0;i<2;i++){ for(int j=0;j<2;j++){ for(int k=0;k<2;k++){ boxes[i][j][k]=new boxCollection(numBoxes,maxBoxes,50,50,50); } } } stroke(0,10); fill(50,10); angle1=random(TWO_PI); angle2=random(PI); da1=random(-0.02,0.02); da2=random(-0.02,0.02); } void draw(){ translate(width/2,height/2); rotateY(angle1+=da1); rotateZ(angle2+=da2); background(255); for(int i=0;i<2;i++){ for(int j=0;j<2;j++){ for(int k=0;k<2;k++){ pushMatrix(); translate(-100+i*200,-100+j*200,-100+k*200); boxes[i][j][k].update(); boxes[i][j][k].draw(); popMatrix(); } } } } void mouseReleased(){ for(int i=0;i<2;i++){ for(int j=0;j<2;j++){ for(int k=0;k<2;k++){ boxes[i][j][k]=new boxCollection(numBoxes,maxBoxes,50,50,50); } } } angle1=random(TWO_PI); angle2=random(PI); da1=random(-0.02,0.02); da2=random(-0.02,0.02); } class box{ int xc,yc,zc,xmin,ymin,zmin,xmax,ymax,zmax; int ax, ay, az; boolean mobilex, mobiley, mobilez, mobile; boolean mobChanged; color c; box(){ } box(int xx, int yy, int zz,color cc){ xc=xx; yc=yy; zc=zz; ax=ay=az=0; mobilex=mobiley=mobilez=mobile=true; xmin=xc-1; xmax=xc+1; ymin=yc-1; ymax=yc+1; zmin=zc-1; zmax=zc+1; mobChanged=false; c=cc; } void grow(){ if (mobilex) { ax++; xmin--; xmax++; } if (mobiley) { ay++; ymin--; ymax++; } if (mobilez) { az++; zmin--; zmax++; } } void update(){ if (mobile){ grow(); } } void checkMobility(){ boolean pMob=mobile; /*if ((xmax>100)||(xmin<-100)) mobilex=false; if ((ymax>100)||(ymin<-100)) mobiley=false; if ((zmax>100)||(zmin<-100)) mobilez=false; */ if (ax>40) mobilex=false; if (ay>40) mobiley=false; if (az>40) mobilez=false; mobile=(mobilex || mobiley || mobilez); mobChanged=(pMob!=mobile); } void draw(){ fill(red(c),green(c),blue(c),100-(ax+ay+az)*1.25); pushMatrix(); translate(xc,yc,zc); box(2*ax,2*ay,2*az); popMatrix(); } } class boxCollection{ box[] boxes; int numBoxes; int maxBoxes; int xlim,ylim,zlim; boxCollection(){ } boxCollection(int num, int max, int xx, int yy, int zz){ boxes=new box[max]; numBoxes=num; maxBoxes=max; xlim=xx; ylim=yy; zlim=zz; for(int i=0;iboxes[i].ax+1)||(abs(boxes[i].yc-yy)>boxes[i].ay+1)||(abs(boxes[i].zc-zz)>boxes[i].az+1)); } return result; } boolean collisionx(box bi, box bj){ if ((abs(bi.yc-bj.yc)<(bi.ay+bj.ay))&&(abs(bi.zc-bj.zc)<(bi.az+bj.az))) return (abs(bi.xc-bj.xc)<=bi.ax+bj.ay); return false; } boolean collisiony(box bi, box bj){ if ((abs(bi.xc-bj.xc)<(bi.ax+bj.ax))&&(abs(bi.zc-bj.zc)<(bi.az+bj.az))) return(abs(bi.yc-bj.yc)<=bi.ay+bj.ay); return false; } boolean collisionz(box bi, box bj){ if ((abs(bi.yc-bj.yc)<(bi.ay+bj.ay))&&(abs(bi.xc-bj.xc)<(bi.ax+bj.ax))) return(abs(bi.zc-bj.zc)<=bi.az+bj.az); return false; } } class palette{//colors derived from image, alpha fixed, adapted from Jared Tarbell, http://www.complexification.net/ int numpal, maxpal, alfa; color[] colors; String source; palette(int mp, int aa, String ss){ numpal=0; maxpal=mp; alfa=aa; colors=new color[maxpal]; source=ss; putColor(source); } color getColor() {// return random color from palette return colors[int(random(numpal))]; } void putColor(String sourceName) {//check source image and retrieve unique colors //As a side effect of this procedure, the source images are briefly displayed. Only noticeable if the first frame takes a long time to render. PImage source; source = loadImage(sourceName); //image(source,0,0);//temporarily display image for (int i=0;i