//W:Mute 2004 - Abstract //www.wmute.org // Game of life extended to 2.5 dimensions. A variable interaction between several layers is included. int xsiz=100; int ysiz=40; int zsiz=20; int hxsiz=xsiz/2; int hzsiz=zsiz/2; float cores=0.2f; int interaction=2; int range=4; int comeAlive = 3; int belongDead = 4; float oCores=cores; int oInteraction=interaction; int oRange=range; int oComeAlive=comeAlive; int oBelongDead=belongDead; int blur=180; boolean changed=false; boolean textOn=true; boolean resetCalled=false; boolean noise=false; int currentSites[] = new int[xsiz*ysiz*zsiz]; int newSites[] = new int[xsiz*ysiz*zsiz]; int indices[][][]=new int[xsiz][ysiz][zsiz]; float ax[]=new float[xsiz*ysiz*zsiz]; float ay[]=new float[xsiz*ysiz*zsiz]; int w=400; int output[] = new int[640*360]; BFont fontA; float sscale = w/50; float csize; int index=0; HScrollbar hs1,hs2,hs3,hs4,hs5,hs6; void setup() { size(640,360); fontA = loadFont("Futura-Medium.vlw.gz"); textFont(fontA,18); framerate(30); colorMode(HSB); hs1 = new HScrollbar(450, 70, 180, 10, 1,50); hs2 = new HScrollbar(450, 120, 180, 10,1,72); hs3 = new HScrollbar(450, 170, 180, 10,1,120); hs4 = new HScrollbar(450, 220, 180, 10,1,60); hs5 = new HScrollbar(450, 270, 180, 10,1,40); hs6 = new HScrollbar(450, 320, 180, 10,1,60); background(40,58,255); noStroke(); for (int i=0; ibelongDead))) {newSites[index]=0;}; index++; } } } index=0; push(); translate(100,20,100); rotateY(1.0); for (int i=0; i0) { csize=sscale / (1.0 + 0.5*abs(hzsiz - k)); fill(141,119,120+20*abs(hzsiz - k),255-i*255/xsiz); push(); translate(sscale*i, sscale*j, sscale*k); push(); if (noise){ rotateX(ax[index]); rotateY(ay[index]); }; box(0.7*csize); pop(); pop(); } currentSites[index]=newSites[index]; index++; } } } pop(); index=0; for(int i=0; i<640; i++) { for(int j=0; j<360; j++) { pixels[index] = blend(pixels[index], output[index],blur) ; output[index] = pixels[index]; index++; } } hs1.update(); hs2.update(); hs3.update(); hs4.update(); hs5.update(); hs6.update(); hs1.draw(); hs2.draw(); hs3.draw(); hs4.draw(); hs5.draw(); hs6.draw(); if (textOn) { smooth(); fill(141,119,100); stroke(141,119,100); text("Start: " + nf(cores,1,2),450, 60); text("Interaction: " + interaction,450, 110); text("Z-layers: " + range,450, 160); text("Come Alive: " + comeAlive,450, 210); text("Belong Dead: " + belongDead,450, 260); text("Blur: " + blur,450, 310); noStroke(); noSmooth(); } } void keyPressed(){ { if (key==' ') { textOn=!textOn; } else { if ((key=='n')||(key=='N')){ noise=!noise; } else { resetCalled=true; } } } } int mix(int a,int b, int f) { return a+(((b-a)*f)>>8); } int blend(int a, int b, int f) { return mix(a>>16,b>>16,f)<<16 | mix(a>>8&0xff,b>>8&0xff,f)<<8 | mix(a&0xff,b&0xff,f); } void reset() { index=0; for (int i=0; i 1) { spos = spos + (newspos-spos)/loose; } } int constrain(int val, int minv, int maxv) { return min(max(val, minv), maxv); } boolean over() { if(mouseX > xpos && mouseX < xpos+swidth && mouseY > ypos && mouseY < ypos+sheight) { return true; } else { return false; } } void draw() { fill(141,119,100,50); rect(xpos, ypos, swidth, sheight); if(over || locked) { fill(141,119,200); } else { fill(0,0, 102); } rect(spos, ypos, sheight, sheight); } float getPos() { // convert spos to be values between // 0 and the total width of the scrollbar return (spos-xpos) * ratio; } }