class Flake { float x,y,vx,vy; float rot,spin; float orad; int nbrPoints; PVector[] pts; float sWeight; Flake() { init(); } void init() { x = random(width); y = -(24 + random(height*2)); rot = random(TWO_PI); spin = random(-.03,.03); vx = 0; vy = 0; orad = 12 + sq(random(1))*16; sWeight = orad/32.0; nbrPoints = int(random(5,15))*2; pts = new PVector[nbrPoints]; for (int i = 0; i < nbrPoints; ++i) { pts[i] = new PVector( cos( random(TWO_PI))*random(orad), sin(random(TWO_PI))*random(orad) ); } } void physics() { vx += random(-.2,.2); vy += random(-.2,.2); vy += .2; vx *= .9; vy *= .9; x += vx; y += vy; rot += spin; if (y > height + 24) { init(); } if (x > width+24) { x = -24; } if (x < -24) { x = width+24; } } void render() { strokeWeight(sWeight); // Shadow pass stroke( #aaaaaa ); pushMatrix(); translate(x+1, y+1); rotate(rot-PI/2); // Point upwards for (int reflection = 0; reflection < 6; ++reflection) { for (int i = 0; i < nbrPoints-1; i += 2) { line( pts[i].x, pts[i].y, pts[i+1].x, pts[i+1].y ); } rotate( radians(60) ); } popMatrix(); // Foreground pass stroke( #ffffff ); pushMatrix(); translate(x, y); rotate(rot-PI/2); // Point upwards for (int reflection = 0; reflection < 6; ++reflection) { for (int i = 0; i < nbrPoints-1; i += 2) { line( pts[i].x, pts[i].y, pts[i+1].x, pts[i+1].y ); } rotate( radians(60) ); } popMatrix(); } } ArrayListflakes; int nbrFlakes = 40; void setup() { size(500,500); smooth(); strokeWeight(2); flakes = new ArrayList (); for (int i = 0; i < nbrFlakes; ++i) { flakes.add( new Flake()); } } void draw() { for (int i = 0; i < height; ++i) { stroke( lerpColor( #00bfff, #ffffff, i/(float)height)); rect(0,i,width,1); } stroke( #ffffff ); noFill(); for (Flake f : flakes) { f.physics(); f.render(); } }