Vector triangles = new Vector(); int picked; float angle = 0.0; void setup() { size(400,300,P3D); framerate(30); for (int i = 0; i < 256; i++) { triangles.add(new Triangle()); } } void draw() { background(255); pushMatrix(); translate(width/2,height/2,-(width+height)/2); rotateY(angle); translate(-width/2,-height/2,(width+height)/2); beginShape(TRIANGLES); noStroke(); for (int i = 0; i < triangles.size(); i++) { Triangle t = (Triangle)triangles.get(i); fill(0xff000000 | i); vertex(t.a.x,t.a.y,t.a.z); vertex(t.b.x,t.b.y,t.b.z); vertex(t.c.x,t.c.y,t.c.z); } endShape(); popMatrix(); if (g instanceof PGraphics3) { picked = get(mouseX,mouseY); } else { picked = get(mouseX,height-mouseY); // color from get() should be index of triangle under mouse - OPENGL needs mouseY flipping - bug? } picked = (picked<<16)>>16; // get rid of alpha so we have the index in a usable form background(255); lights(); pushMatrix(); translate(width/2,height/2,-(width+height)/2); rotateY(angle); translate(-width/2,-height/2,(width+height)/2); beginShape(TRIANGLES); noStroke(); for (int i = 0; i < triangles.size(); i++) { Triangle t = (Triangle)triangles.get(i); if (i == picked) { fill(#ff8080); } else if (t.clicked) { fill(#ff0000); } else { fill(200); } vertex(t.a.x,t.a.y,t.a.z); vertex(t.b.x,t.b.y,t.b.z); vertex(t.c.x,t.c.y,t.c.z); if (t.clicked) { t.shrink(); } } endShape(); popMatrix(); angle += 0.025; angle %= TWO_PI; println(framerate); } void mouseReleased() { if (picked >= 0 && picked < triangles.size()) { Triangle t = (Triangle)triangles.get(picked); t.clicked = !t.clicked; } }