#include #include #include #include "types.h" GLuint ballDL, bumperDL, paddleDL; GLfloat bumperColors[BUMPER_COLORS][3] = {{1.0f, 0.0f, 0.0f}, {0.0f, 1.0f, 0.0f}, {0.0f, 0.0f, 1.0f}, {0.5f, 0.5f, 0.5f}}; void initGL() { GLfloat ambient[] = {0.5f, 0.5f, 0.5f, 1.0f}; GLfloat diffuse[] = {1.0f, 1.0f, 1.0f, 1.0f}; GLfloat position[] = {0.0f, 0.0f, 2.0f, 1.0f}; SDL_Init( SDL_INIT_VIDEO ); SDL_GL_SetAttribute( SDL_GL_RED_SIZE, 8 ); SDL_GL_SetAttribute( SDL_GL_GREEN_SIZE, 8 ); SDL_GL_SetAttribute( SDL_GL_BLUE_SIZE, 8 ); SDL_GL_SetAttribute( SDL_GL_DEPTH_SIZE, 8 ); SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 ); SDL_SetVideoMode( 800, 600, 24, SDL_OPENGL | SDL_HWSURFACE ); glViewport( 0, 0, 800, 600 ); glMatrixMode( GL_PROJECTION ); glLoadIdentity(); gluPerspective( 45.0f, 800.0f/600.0f, 0.1f, 100.0f ); glMatrixMode( GL_MODELVIEW ); glLoadIdentity(); glShadeModel( GL_SMOOTH ); glClearColor( 0.0f, 0.0f, 0.0f, 0.0f ); glClearDepth( 1.0f ); glEnable( GL_DEPTH_TEST ); glDepthFunc( GL_LEQUAL ); glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST ); glLightfv( GL_LIGHT1, GL_AMBIENT, ambient ); glLightfv( GL_LIGHT1, GL_DIFFUSE, diffuse ); glLightfv( GL_LIGHT1, GL_POSITION, position ); glEnable( GL_LIGHT1 ); } void initModels() { ballDL = glGenLists( 3 ); bumperDL = ballDL + 1; paddleDL = ballDL + 2; glNewList( ballDL, GL_COMPILE ); GLfloat twothirds = PINBALL_RADIUS * (2.0f/3.0f); GLfloat rootthree = PINBALL_RADIUS / (1.7320508f); GLfloat ttrt = twothirds / (1.7320508f); glBegin( GL_TRIANGLE_FAN ); { glVertex3f( 0.0f, 0.0f, PINBALL_RADIUS ); glVertex3f( 0.0f, twothirds, twothirds ); glVertex3f( ttrt, ttrt, twothirds ); glVertex3f( twothirds, 0.0f, twothirds ); glVertex3f( ttrt, -ttrt, twothirds ); glVertex3f( 0.0f, -twothirds, twothirds ); glVertex3f( -ttrt, -ttrt, twothirds ); glVertex3f( -twothirds, 0.0f, twothirds ); glVertex3f( -ttrt, ttrt, twothirds ); glVertex3f( 0.0f, twothirds, twothirds ); } glEnd(); glBegin( GL_QUAD_STRIP ); { glVertex3f( 0.0f, twothirds, twothirds ); glVertex3f( 0.0f, PINBALL_RADIUS, 0.0f ); glVertex3f( ttrt, ttrt, twothirds ); glVertex3f( rootthree, rootthree, 0.0f ); glVertex3f( twothirds, 0.0f, twothirds ); glVertex3f( PINBALL_RADIUS, 0.0f, 0.0f ); glVertex3f( ttrt, -ttrt, twothirds ); glVertex3f( rootthree, -rootthree, 0.0f ); glVertex3f( 0.0f, -twothirds, twothirds ); glVertex3f( 0.0f, -PINBALL_RADIUS, 0.0f ); glVertex3f( -ttrt-, -ttrt, twothirds ); glVertex3f( -rootthree, -rootthree, 0.0f ); glVertex3f( -twothirds, 0.0f, twothirds ); glVertex3f( -PINBALL_RADIUS, 0.0f, 0.0f ); glVertex3f( -ttrt, ttrt, twothirds ); glVertex3f( -rootthree, rootthree, 0.0f ); glVertex3f( 0.0f, twothirds, twothirds ); glVertex3f( 0.0f, PINBALL_RADIUS, 0.0f ); } glEnd(); glEndList(); glNewList( paddleDL, GL_COMPILE ); glBegin( GL_QUADS ); { glVertex3f( -0.1f, 0.2f, 0.2f ); glVertex3f( PADDLE_LENGTH, 0.1f, 0.2f ); glVertex3f( PADDLE_LENGTH, -0.1f, 0.2f ); glVertex3f( -0.1f, -0.1f, 0.2f ); glVertex3f( -0.1f, 0.2f, 0.2f ); glVertex3f( -0.1f, 0.2f, 0.0f ); glVertex3f( PADDLE_LENGTH, 0.1f, 0.0f ); glVertex3f( PADDLE_LENGTH, 0.1f, 0.2f ); glVertex3f( PADDLE_LENGTH, 0.1f, 0.2f ); glVertex3f( PADDLE_LENGTH, 0.1f, 0.0f ); glVertex3f( PADDLE_LENGTH, -0.1f, 0.0f ); glVertex3f( PADDLE_LENGTH, -0.1f, 0.2f ); glVertex3f( -0.1f, -0.1f, 0.2f ); glVertex3f( PADDLE_LENGTH, -0.1f, 0.2f ); glVertex3f( PADDLE_LENGTH, -0.1f, 0.0f ); glVertex3f( -0.1f, -0.1f, 0.0f ); glVertex3f( -0.1f, 0.2f, 0.2f ); glVertex3f( -0.1f, -0.1f, 0.2f ); glVertex3f( -0.1f, -0.1f, 0.0f ); glVertex3f( -0.1f, 0.2f, 0.0f ); } glEnd(); glEndList(); glNewList( bumperDL, GL_COMPILE ); glBegin( GL_TRIANGLE_FAN ); { glVertex3f( 0.0f, 0.0f, 3.0f ); glVertex3f( 0.0f, 2.0f, 3.0f ); glVertex3f( 1.1547f, 1.1547f, 3.0f ); glVertex3f( 2.0f, 0.0f, 3.0f ); glVertex3f( 1.1547f, -1.1547f, 3.0f ); glVertex3f( 0.0f, -2.0f, 3.0f ); glVertex3f( -1.1547f, -1.1547f, 3.0f ); glVertex3f( -2.0f, 0.0f, 3.0f ); glVertex3f( -1.1547f, 1.1547f, 3.0f ); glVertex3f( 0.0f, 2.0f, 3.0f ); } glEnd(); glBegin( GL_QUAD_STRIP ); { glVertex3f( 0.0f, 2.0f, 3.0f ); glVertex3f( 0.0f, 2.0f, 1.5f ); glVertex3f( 1.1547f, 1.1547f, 3.0f ); glVertex3f( 1.1547f, 1.1547f, 1.5f ); glVertex3f( 2.0f, 0.0f, 3.0f ); glVertex3f( 2.0f, 0.0f, 1.5f ); glVertex3f( 1.1547f, -1.1547f, 3.0f ); glVertex3f( 1.1547f, -1.1547f, 1.5f ); glVertex3f( 0.0f, -2.0f, 3.0f ); glVertex3f( 0.0f, -2.0f, 1.5f ); glVertex3f( -1.1547f, -1.1547f, 3.0f ); glVertex3f( -1.1547f, -1.1547f, 1.5f ); glVertex3f( -2.0f, 0.0f, 3.0f ); glVertex3f( -2.0f, 0.0f, 1.5f ); glVertex3f( -1.1547f, 1.1547f, 3.0f ); glVertex3f( -1.1547f, 1.1547f, 1.5f ); glVertex3f( 0.0f, 2.0f, 3.0f ); glVertex3f( 0.0f, 2.0f, 1.5f ); } glEnd(); glEndList(); }