/* Spiral Particle System Lee Felarca 5/2008 Source code licensed under a Creative Commons Attribution 3.0 License. http://creativecommons.org/licenses/by/3.0/ Some Rights Reserved. */ // import processing.opengl.*; float DEGREE = (float)Math.PI / 180; int KEYCODE_ONE = 49; Particle particles[]; int numParticles = 500; int indexer = -1; int iteration = 0; char transformMode = '1'; Slider sliderParam1Step, sliderParam2Step, sliderParam3Step; Slider sliderParam1Start, sliderParam3Start, sliderSpeed, sliderZoom; Button buttons[]; PFont font; void setup() { size(600,600, P3D); frameRate(60); //font = loadFont("Hooge0553-12.vlw"); particles = new Particle[numParticles]; sliderParam1Step = new Slider(20,18, 150, 13, 0.5); sliderParam2Step = new Slider(20,36, 150, 13, 0.5); sliderParam3Step = new Slider(20,54, 150, 13, 0.5); sliderParam1Start = new Slider( width/2 - 150/2,18, 150, 13, 0.75 ); // no need for param2 sliderParam3Start = new Slider( width/2 - 150/2,36, 150, 13, 0.75 ); sliderSpeed = new Slider(width-150-20,18, 150, 13, 0.5); sliderZoom = new Slider(20,height-20, 150, 13, 0.75); buttons = new Button[6]; for (int i = 0; i < buttons.length; i++) { buttons[i] = new Button(width - 125 + i*20, height - 25, 13); } buttons[0].selected = true; } void keyPressed() { if (keyCode >= KEYCODE_ONE && keyCode <= KEYCODE_ONE + 5) transformMode = key; else if (key==' ') { indexer = -1; iteration = 0; } println(keyCode); } void draw() { iteration++; indexer = (indexer < numParticles-1) ? (indexer+1) : 0; checkForButtonFlag(); particles[indexer] = newParticle(); fill(255); background(0); float cz = sliderZoom.getValue(); cz = lerp(3000,100, cz); float cx = lerp(-cz/3,cz/3, (float)mouseX / (float)width); float cy = lerp(-cz/3,cz/3, (float)mouseY/ (float)height); camera(cx,cy,cz, 0,0,0, 0,1,0); lights(); for (int i = 0; i < min(iteration, numParticles); i++) { Particle p = particles[i]; transformAndDraw(p); p.advance(); } // Draw interface: camera(); sliderParam1Step.update(); sliderParam2Step.update(); sliderParam3Step.update(); sliderParam1Start.update(); sliderParam3Start.update(); sliderSpeed.update(); sliderZoom.update(); for (int i = 0; i < buttons.length; i++) { buttons[i].update(); } } Particle newParticle() { Particle newP = new Particle(); newP.distance = 0; newP.distanceStep = 0.010 * sliderSpeed.getValue(); newP.param1 = iteration * 20*DEGREE * sliderParam1Start.getValue(); newP.param1Step = 3*DEGREE * sliderParam1Step.getValue(); newP.param2 = 0; newP.param2Step = 3*DEGREE * sliderParam2Step.getValue(); newP.param2 = iteration * 20*DEGREE * sliderParam3Start.getValue(); newP.param3Step = 3*DEGREE * sliderParam3Step.getValue(); newP.col = color( (int)(sliderParam1Step.getValue()*255), (int)(sliderParam2Step.getValue()*255), (int)(sliderParam3Step.getValue()*255) ); return newP; } void transformAndDraw(Particle $p) { pushMatrix(); switch (transformMode) { case '1': rotateX($p.param2); rotateY($p.param1); rotateZ($p.param3); break; case '2': rotateX($p.param2); rotateZ($p.param3); rotateY($p.param1); break; case '3': rotateY($p.param1); rotateX($p.param2); rotateZ($p.param3); break; case '4': rotateY($p.param1); rotateZ($p.param3); rotateX($p.param2); break; case '5': rotateZ($p.param3); rotateX($p.param2); rotateY($p.param1); break; case '6': rotateZ($p.param3); rotateY($p.param1); rotateX($p.param2); break; } translate(0,0, $p.distance*500); ambient($p.col); noStroke(); box(10,10,10); popMatrix(); } void checkForButtonFlag() { for (int i = 0; i < buttons.length; i++) { if (buttons[i].clickedFlag==true) { for (int j = 0; j < buttons.length; j++) buttons[j].selected = false; transformMode = (char)(i + KEYCODE_ONE); buttons[i].selected = true; buttons[i].clickedFlag = false; } } }