/**
Packetdrop - The day 5 door for my 2010 Advent calendar
by Guru
*/
import org.jbox2d.util.nonconvex.*;
import org.jbox2d.dynamics.contacts.*;
import org.jbox2d.testbed.*;
import org.jbox2d.collision.*;
import org.jbox2d.common.*;
import org.jbox2d.dynamics.joints.*;
import org.jbox2d.p5.*;
import org.jbox2d.dynamics.*;
import java.util.ArrayList;
Physics physics;
ArrayList packets;
ArrayList colors;
void setup() {
size( 300,300, P2D );
physics = new Physics( this, 300,300);
physics.setDensity( 1.0f);
packets = new ArrayList();
colors = new ArrayList();
addPacket();
physics.setCustomRenderingMethod( this, "customDraw" );
smooth();
}
void keyPressed() {
addPacket();
}
void draw() {
background(0);
}
void customDraw(World w) {
for( int pi = 0; pi < packets.size(); pi ++ ) {
Body body = (Body)packets.get(pi);
color col = ((Integer)colors.get(pi)).intValue();
for ( Shape s = body.getShapeList(); s != null; s = s.getNext()) {
if (s.getType() == ShapeType.POLYGON_SHAPE ) {
fill(col);
noStroke();
beginShape();
PolygonShape poly = (PolygonShape)s;
int c = poly.getVertexCount();
Vec2[] verts = poly.getVertices();
Vec2[] wverts = new Vec2[verts.length];
for( int i=0; i < c; i++) {
wverts[i] = physics.worldToScreen( body.getWorldPoint( verts[i]));
vertex( wverts[i].x, wverts[i].y );
}
endShape(CLOSE);
stroke(255,0,0);
strokeWeight(2);
line( wverts[0].x + (wverts[1].x - wverts[0].x)/2,
wverts[0].y + (wverts[1].y - wverts[0].y)/2,
wverts[2].x + (wverts[3].x - wverts[2].x)/2,
wverts[2].y + (wverts[3].y - wverts[2].y)/2
);
line( wverts[1].x + (wverts[2].x - wverts[1].x)/2,
wverts[1].y + (wverts[2].y - wverts[1].y)/2,
wverts[3].x + (wverts[0].x - wverts[3].x)/2,
wverts[3].y + (wverts[0].y - wverts[3].y)/2
);
noFill();
beginShape();
float x = verts[2].x + (verts[3].x - verts[2].x)/2;
float y = verts[2].y + (verts[3].y - verts[2].y)/2;
Vec2 p1 = physics.worldToScreen( body.getWorldPoint( new Vec2( x, y )));
Vec2 p2 = physics.worldToScreen( body.getWorldPoint( new Vec2( x+1.2, y+0.5 )));
Vec2 p3 = physics.worldToScreen( body.getWorldPoint( new Vec2( x, y+1.5 )));
Vec2 p4 = physics.worldToScreen( body.getWorldPoint( new Vec2( x-1.2, y+0.5 )));
vertex( p1.x, p1.y );
bezierVertex( p2.x, p2.y, p3.x,p3.y, p1.x, p1.y );
bezierVertex( p3.x, p3.y, p4.x, p4.y, p1.x, p1.y );
endShape();
}
}
}
}
void addPacket() {
int ofs = int(random(10));
int h = 10 + int(random(40));
int w = 10 + int(random(40));
packets.add(physics.createRect( 100 + ofs, 10, 100 + w + ofs, 10 + h ));
colorMode( HSB );
colors.add( color( random( 255 ), 255, 255 ));
colorMode( RGB );
}