/** 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 ); }