void Mouse( int button, int state, int x, int y ) { x /= 10.0f; y /= 10.0f; if(state == GLUT_DOWN) switch(button) { case GLUT_LEFT_BUTTON: { PolygonShape poly; uint32 count = (uint32)Random( 3, MaxPolyVertexCount ); Vec2 *vertices = new Vec2[count]; real e = Random( 5, 10 ); for(uint32 i = 0; i < count; ++i) vertices[i].Set( Random( -e, e ), Random( -e, e ) ); poly.Set( vertices, count ); Body *b = scene.Add( &poly, x, y ); b->SetOrient( Random( -PI, PI ) ); b->restitution = 0.2f; b->dynamicFriction = 0.2f; b->staticFriction = 0.4f; delete [] vertices; } break; case GLUT_RIGHT_BUTTON: { Circle c( Random( 1.0f, 3.0f ) ); Body *b = scene.Add( &c, x, y ); } break; } }
int main( void ) { glutInitDisplayMode( GLUT_RGBA | GLUT_DOUBLE ); glutInitWindowSize( 800, 600 ); glutCreateWindow( "PhyEngine" ); glutDisplayFunc( PhysicsLoop ); glutKeyboardFunc( Keyboard ); glutMouseFunc( Mouse ); glutIdleFunc( PhysicsLoop ); glMatrixMode( GL_PROJECTION ); glPushMatrix( ); glLoadIdentity( ); gluOrtho2D( 0, 80, 60, 0 ); glMatrixMode( GL_MODELVIEW ); glPushMatrix( ); glLoadIdentity( ); Circle c( 5.0f ); Body *b = scene.Add( &c, 40, 40 ); b->SetStatic( ); PolygonShape poly; poly.SetBox( 30.0f, 1.0f ); b = scene.Add( &poly, 40, 55 ); b->SetStatic( ); b->SetOrient( 0 ); srand( 1 ); glutMainLoop( ); return 0; }