import nl.patashnik.processing.*; import processing.opengl.*; boolean doFill = true, doVariation = false; int SHAPE = TRIANGLE_FAN; DepthShader ds = new DepthShader(this, 0, 255); float A = 3 * PI, B = 4 * PI, C = A; void setup() { size(600, 600, OPENGL); frameRate(25); } void keyPressed() { switch (key) { case '1': SHAPE = QUADS; break; case '2': SHAPE = TRIANGLES; break; case '3': SHAPE = TRIANGLE_STRIP; break; case '4': SHAPE = TRIANGLE_FAN; break; case '5': SHAPE = LINES; break; case '6': SHAPE = QUAD_STRIP; break; case 'q': ds.setMapper(new LinearDepthMapper()); break; case 'w': ds.setMapper(new LogDepthMapper()); break; case 'e': ds.setMapper(new SquareDepthMapper()); break; case 'r': ds.setMapper(new ThresholdDepthMapper()); break; case 'f': doFill = ! doFill; break; case 'v': doVariation = ! doVariation; if (doVariation) C = A + B; else C = A; break; } } void mousePressed() { A = random(0, 4) * PI; B = random(0, 4) * PI; if (doVariation) C = A + B; else C = A; } void draw() { background(0, 0, 31); translate(width / 2, height / 2); rotateX(radians(frameCount)); rotateY(radians(frameCount)); rotateZ(radians(frameCount)); scale(width / 3); noFill(); noStroke(); beginShape(SHAPE); for (float t = -PI; t < PI; t += PI / 300) { float x = sin(A * t) * cos(B * t), y = sin(A * t) * sin(B * t), z = cos(C * t); float a = ds.shade(x, y, z); if (doFill) fill(noise(x, y, z) * 255, a); if (SHAPE == TRIANGLE_FAN && doFill) noStroke(); else stroke(255, a); vertex(x, y, z); } endShape(); A += PI / 1024; B += PI / 1024; if (doVariation) C = A + B; else C = A; }