// Car Park by Steven Pennington #include //GLUT base library. #include #include // Maths library #include #include "BMP.h" // BMP Image file loading library. GLuint WallTexture=0,FloorTexture=0; // OpenGL texture handles // Variables int Width = 640; int Height = 480; float Angle = 0.0f; int X = 0; int Y = 1; int Z = 0; int X1 = 0; int Y1 = 1; int Z1 = 1; bool key[256]; void Display(); void Key( unsigned char Key, int x, int y) { switch (Key) { case 'w': Z++, Z1++; // when w is pressed camera moves forwards break; case 's': Z--, Z1--; // when s is pressed camera moves Backwards break; // case 'q': // X++, X1++; // when q is pressed camera moves forwards and turns left // break; // case 'e': // X--, X1-- // when e is pressed camera moves forwards and turns right // break; case 'a': X++, X1++; // when a is pressed camera moves backwards and turns left break; case 'd': X--, X1--; // when d is pressed camera moves backwards and turns right break; case 'm': glPushMatrix(); glTranslated( X, Y, Z ); Angle += 5.0f; // when e is pressed camera turns to the right glPopMatrix(); break; case 'n': Angle -= 5.0f; // when q is pressed camera turns left break; case 'p': Y++, Y1++; // when p is pressed camera moves up break; case 'o': Y--, Y1--; // when 0 is pressed camera moves down break; case 't': exit(0); break; default: break; } } // Resize function void Reshape(int Width, int Height) { // Open GL draw area glViewport(0,0,Width, Height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); // Set FOV, Aspect Ratio and clip-planes gluPerspective(45.0f, (float)Width/(float)Height, 1.0f, 1000.0f); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); return; } //struct { //float position[ 3 ]; //float angle; //float speed; // } car; void Idle() { int Timer = glutGet ( GLUT_ELAPSED_TIME ); while( glutGet( GLUT_ELAPSED_TIME ) - Timer < 20 ); glutPostRedisplay(); } // Rendering function void Render() { glDepthFunc( GL_LEQUAL ); glEnable( GL_DEPTH_TEST ); //glEnable( GL_CULL_FACE ); //clear display glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glLoadIdentity(); // Position Camera gluLookAt( X, Y, Z, X1, Y1, Z1, 0.0f, 1.0f, 0.0f); // Set background colour glClearColor(0.0, 1.0, 1.0, 0.5); glClear(GL_COLOR_BUFFER_BIT); // glTranslatef(); glRotatef( Angle, 0.0f, 1.0f, 0.0f ); glBindTexture(GL_TEXTURE_2D,FloorTexture); // bind the floor texture glBegin(GL_QUADS); // ------ Ground ------ glColor3f( 0.0f, 0.5f, 0.0f ); glTexCoord2f(0,0); glVertex3f( -30.0f, -0.1f, -30.0f); glTexCoord2f(1,0); glVertex3f( -30.0f, -0.1f, 30.0f); glTexCoord2f(1,1); glVertex3f( 30.0f, -0.1f, 30.0f); glTexCoord2f(0,1); glVertex3f( 30.0f, -0.1f, -30.0f); // ------ Lower Level ------ // Lower Ramp glColor3f( 0.5f, 0.5f, 0.5f ); glTexCoord2f(0,0); glVertex3f( -7.5f, 0.0f, 7.5f ); glTexCoord2f(1,0); glVertex3f( -7.5f, 2.0f, -7.5f ); glTexCoord2f(1,1); glVertex3f( 7.5f, 2.0f, -7.5f ); glTexCoord2f(0,1); glVertex3f( 7.5f, 0.0f, 7.5f ); // Floor glColor3f( 0.3, 0.3, 0.3); glTexCoord2f(0,0); glVertex3f( -20.0f, 0.0f, -20.0f ); glTexCoord2f(1,0); glVertex3f( -20.0f, 0.0f, 20.0f ); glTexCoord2f(1,1); glVertex3f( 20.0f, 0.0f, 20.0f ); glTexCoord2f(0,1); glVertex3f( 20.0f, 0.0f, -20.0f ); glEnd(); glBindTexture(GL_TEXTURE_2D,WallTexture); // bind the wall texture glBegin(GL_QUADS); // Walls glColor3f( 0.5, 0.5, 0.5 ); glTexCoord2f(0,0); glVertex3f( -20.0f, 0.0f, 20.0f ); glTexCoord2f(1,0); glVertex3f( -20.0f, 0.5f, 20.0f ); glTexCoord2f(1,1); glVertex3f( -5.0f, 0.5f, 20.0f ); glTexCoord2f(0,1); glVertex3f( -5.0f, 0.0f, 20.0f ); glTexCoord2f(0,0); glVertex3f( 20.0f, 0.0f, 20.0f ); glTexCoord2f(1,0); glVertex3f( 20.0f, 0.5f, 20.0f ); glTexCoord2f(1,1); glVertex3f( 5.0f, 0.5f, 20.0f ); glTexCoord2f(0,1); glVertex3f( 5.0f, 0.0f, 20.0f ); glTexCoord2f(0,0); glVertex3f( -20.0f, 0.0f, -20.0f ); glTexCoord2f(1,0); glVertex3f( -20.0f, 0.5f, -20.0f ); glTexCoord2f(1,1); glVertex3f( 20.0f, 0.5f, -20.0f ); glTexCoord2f(0,1); glVertex3f( 20.0f, 0.0f, -20.0f ); glTexCoord2f(0,0); glVertex3f( -20.0f, 0.0f, -20.0f ); glTexCoord2f(1,0); glVertex3f( -20.0f, 2.0f, -20.0f ); glTexCoord2f(1,1); glVertex3f( -20.0f, 2.0f, 20.0f ); glTexCoord2f(0,1); glVertex3f( -20.0f, 0.0f, 20.0f ); glTexCoord2f(0,0); glVertex3f( 20.0f, 0.0f, -20.0f ); glTexCoord2f(1,0); glVertex3f( 20.0f, 2.0f, -20.0f ); glTexCoord2f(1,1); glVertex3f( 20.0f, 2.0f, 20.0f ); glTexCoord2f(0,1); glVertex3f( 20.0f, 0.0f, 20.0f ); glEnd(); glBindTexture(GL_TEXTURE_2D,FloorTexture); // bind the floor texture glBegin(GL_QUADS); // ------ Middle Level ------ // Upper Ramp glColor3f( 0.5f, 0.5f, 0.5f ); glTexCoord2f(0,0); glVertex3f( -7.5f, 2.0f, 7.5f ); glTexCoord2f(1,0); glVertex3f( -7.5f, 4.0f, -7.5f ); glTexCoord2f(1,1); glVertex3f( 7.5f, 4.0f, -7.5f ); glTexCoord2f(0,1); glVertex3f( 7.5f, 2.0f, 7.5f ); // Floor glColor3f( 0.3, 0.3, 0.3); glTexCoord2f(0,0); glVertex3f( -20.0f, 2.0f, -20.0f ); glTexCoord2f(1,0); glVertex3f( -20.0f, 2.0f, 20.0f ); glTexCoord2f(1,1); glVertex3f( -7.5f, 2.0f, 20.0f ); glTexCoord2f(0,1); glVertex3f( -7.5f, 2.0f, -20.0f ); glTexCoord2f(0,0); glVertex3f( 7.5f, 2.0f, -20.0f ); glTexCoord2f(1,0); glVertex3f( 7.5f, 2.0f, -7.5f ); glTexCoord2f(1,1); glVertex3f( -7.5f, 2.0f, -7.5f ); glTexCoord2f(0,1); glVertex3f( -7.5f, 2.0f, -20.0f ); glTexCoord2f(0,0); glVertex3f( 7.5f, 2.0f, 20.0f ); glTexCoord2f(1,0); glVertex3f( 7.5f, 2.0f, 7.5f ); glTexCoord2f(1,1); glVertex3f( -7.5f, 2.0f, 7.5f ); glTexCoord2f(0,1); glVertex3f( -7.5f, 2.0f, 20.0f ); glTexCoord2f(0,0); glVertex3f( 20.0f, 2.0f, -20.0f ); glTexCoord2f(1,0); glVertex3f( 20.0f, 2.0f, 20.0f ); glTexCoord2f(1,1); glVertex3f( 7.5f, 2.0f, 20.0f ); glTexCoord2f(0,1); glVertex3f( 7.5f, 2.0f, -20.0f ); glEnd(); glBindTexture(GL_TEXTURE_2D,WallTexture); // bind the wall texture glBegin(GL_QUADS); // Walls glColor3f( 0.5, 0.5, 0.5 ); glTexCoord2f(0,0); glVertex3f( -20.0f, 2.0f, 20.0f ); glTexCoord2f(1,0); glVertex3f( -20.0f, 4.0f, 20.0f ); glTexCoord2f(1,1); glVertex3f( 20.0f, 4.0f, 20.0f ); glTexCoord2f(0,1); glVertex3f( 20.0f, 2.0f, 20.0f ); glTexCoord2f(0,0); glVertex3f( -20.0f, 2.0f, -20.0f ); glTexCoord2f(1,0); glVertex3f( -20.0f, 4.0f, -20.0f ); glTexCoord2f(1,1); glVertex3f( 20.0f, 4.0f, -20.0f ); glTexCoord2f(0,1); glVertex3f( 20.0f, 2.0f, -20.0f ); glTexCoord2f(0,0); glVertex3f( -20.0f, 2.0f, -20.0f ); glTexCoord2f(1,0); glVertex3f( -20.0f, 2.5f, -20.0f ); glTexCoord2f(1,1); glVertex3f( -20.0f, 2.5f, 20.0f ); glTexCoord2f(0,1); glVertex3f( -20.0f, 2.0f, 20.0f ); glTexCoord2f(0,0); glVertex3f( 20.0f, 2.0f, -20.0f ); glTexCoord2f(1,0); glVertex3f( 20.0f, 2.5f, -20.0f ); glTexCoord2f(1,1); glVertex3f( 20.0f, 2.5f, 20.0f ); glTexCoord2f(0,1); glVertex3f( 20.0f, 2.0f, 20.0f ); // Barrier Walls glTexCoord2f(0,0); glVertex3f( 7.5f, 2.0f, 7.5f ); glTexCoord2f(1,0); glVertex3f( 7.5f, 2.5f, 7.5f ); glTexCoord2f(1,1); glVertex3f( 7.5f, 2.5f, -7.5f ); glTexCoord2f(0,1); glVertex3f( 7.5f, 2.0f, -7.5f ); glTexCoord2f(0,0); glVertex3f( -7.5f, 2.0f, 7.5f ); glTexCoord2f(1,0); glVertex3f( -7.5f, 2.5f, 7.5f ); glTexCoord2f(1,1); glVertex3f( -7.5f, 2.5f, -7.5f ); glTexCoord2f(0,1); glVertex3f( -7.5f, 2.0f, -7.5f ); glEnd(); glBindTexture(GL_TEXTURE_2D,FloorTexture); // bind the floor texture glBegin(GL_QUADS); // ------ Upper Level ------ // Floor glColor3f( 0.3, 0.3, 0.3); glTexCoord2f(0,0); glVertex3f( -20.0f, 4.0f, -20.0f ); glTexCoord2f(1,0); glVertex3f( -20.0f, 4.0f, 20.0f ); glTexCoord2f(1,1); glVertex3f( -7.5f, 4.0f, 20.0f ); glTexCoord2f(0,1); glVertex3f( -7.5f, 4.0f, -20.0f ); glTexCoord2f(0,0); glVertex3f( 7.5f, 4.0f, -20.0f ); glTexCoord2f(1,0); glVertex3f( 7.5f, 4.0f, -7.5f ); glTexCoord2f(1,1); glVertex3f( -7.5f, 4.0f, -7.5f ); glTexCoord2f(0,1); glVertex3f( -7.5f, 4.0f, -20.0f ); glTexCoord2f(0,0); glVertex3f( 7.5f, 4.0f, 20.0f ); glTexCoord2f(1,0); glVertex3f( 7.5f, 4.0f, 7.5f ); glTexCoord2f(1,1); glVertex3f( -7.5f, 4.0f, 7.5f ); glTexCoord2f(0,1); glVertex3f( -7.5f, 4.0f, 20.0f ); glTexCoord2f(0,0); glVertex3f( 20.0f, 4.0f, -20.0f ); glTexCoord2f(1,0); glVertex3f( 20.0f, 4.0f, 20.0f ); glTexCoord2f(1,1); glVertex3f( 7.5f, 4.0f, 20.0f ); glTexCoord2f(0,1); glVertex3f( 7.5f, 4.0f, -20.0f ); glEnd(); glBindTexture(GL_TEXTURE_2D,WallTexture); // bind the wall texture glBegin(GL_QUADS); // Walls glColor3f( 0.5, 0.5, 0.5 ); glTexCoord2f(0,0); glVertex3f( -20.0f, 4.0f, 20.0f ); glTexCoord2f(1,0); glVertex3f( -20.0f, 4.5f, 20.0f ); glTexCoord2f(1,1); glVertex3f( 20.0f, 4.5f, 20.0f ); glTexCoord2f(0,1); glVertex3f( 20.0f, 4.0f, 20.0f ); glColor3f( 0.5, 0.5, 0.5 ); glTexCoord2f(0,0); glVertex3f( -20.0f, 4.0f, -20.0f ); glTexCoord2f(1,0); glVertex3f( -20.0f, 4.5f, -20.0f ); glTexCoord2f(1,1); glVertex3f( 20.0f, 4.5f, -20.0f ); glTexCoord2f(0,1); glVertex3f( 20.0f, 4.0f, -20.0f ); glColor3f( 0.5, 0.5, 0.5 ); glTexCoord2f(0,0); glVertex3f( -20.0f, 4.0f, -20.0f ); glTexCoord2f(1,0); glVertex3f( -20.0f, 4.5f, -20.0f ); glTexCoord2f(1,1); glVertex3f( -20.0f, 4.5f, 20.0f ); glTexCoord2f(0,1); glVertex3f( -20.0f, 4.0f, 20.0f ); glColor3f( 0.5, 0.5, 0.5 ); glTexCoord2f(0,0); glVertex3f( 20.0f, 4.5f, -20.0f ); glTexCoord2f(1,0); glVertex3f( 20.0f, 4.0f, -20.0f ); glTexCoord2f(1,1); glVertex3f( 20.0f, 4.0f, 20.0f ); glTexCoord2f(0,1); glVertex3f( 20.0f, 4.5f, 20.0f ); // Barrier Walls glTexCoord2f(0,0); glVertex3f( 7.5f, 4.0f, 7.5f ); glTexCoord2f(1,0); glVertex3f( 7.5f, 4.5f, 7.5f ); glTexCoord2f(1,1); glVertex3f( 7.5f, 4.5f, -7.5f ); glTexCoord2f(0,1); glVertex3f( 7.5f, 4.0f, -7.5f ); glTexCoord2f(0,0); glVertex3f( -7.5f, 4.0f, 7.5f ); glTexCoord2f(1,0); glVertex3f( -7.5f, 4.5f, 7.5f ); glTexCoord2f(1,1); glVertex3f( -7.5f, 4.5f, -7.5f ); glTexCoord2f(0,1); glVertex3f( -7.5f, 4.0f, -7.5f ); glTexCoord2f(0,0); glVertex3f( 7.5f, 4.0f, 7.5f ); glTexCoord2f(1,0); glVertex3f( 7.5f, 4.5f, 7.5f ); glTexCoord2f(1,1); glVertex3f( -7.5f, 4.5f, 7.5f ); glTexCoord2f(0,1); glVertex3f( -7.5f, 4.0f, 7.5f ); glEnd(); glutSwapBuffers(); // Swap buffers } // void movethecar() // { // car.speed += key['w'] - key['s']; // Get movement Input // car.speed*= 0.9f; // Apply "Friction" // car.angle-=( key['d'] - key['a'] ) * car.speed; // Turn car depending on speed // car.position[ 0 ] += car.speed * sin( car.angle ); // car.position[ 1 ] += car.speed * cos( car.angle ); // } void create_textures() { BMPImage WallImage,FloorImage; if(WallImage.LoadFile("wall.bmp")==BMPImage::ERR_NoErrors) { glGenTextures(1,&WallTexture); // make a new texture handle glPixelStorei(GL_UNPACK_ALIGNMENT,1); // make sure the pixels are aligned to 1 byte glBindTexture(GL_TEXTURE_2D,WallTexture); // bind to the new texture glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); // simple filtering glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); // simple filtering /* upload the texture data to the graphics card, with relevant settings, obtained from the bitmap file. */ glTexImage2D( GL_TEXTURE_2D,0,WallImage.BytesPerPixel, WallImage.Width,WallImage.Height,0, (WallImage.BytesPerPixel==3) ? GL_RGB : GL_RGBA, GL_UNSIGNED_BYTE,WallImage.Data); } if(FloorImage.LoadFile("floor.bmp")==BMPImage::ERR_NoErrors) { glGenTextures(1,&FloorTexture); // make a new texture handle glPixelStorei(GL_UNPACK_ALIGNMENT,1); // make sure the pixels are aligned to 1 byte glBindTexture(GL_TEXTURE_2D,FloorTexture); // bind to the new texture glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); // simple filtering glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); // simple filtering /* upload the texture data to the graphics card, with relevant settings, obtained from the bitmap file. */ glTexImage2D( GL_TEXTURE_2D,0,FloorImage.BytesPerPixel, FloorImage.Width,FloorImage.Height,0, (FloorImage.BytesPerPixel==3) ? GL_RGB : GL_RGBA, GL_UNSIGNED_BYTE,FloorImage.Data); } } // main loop main(int argc, char *argv[]) { // Create window glutInit(&argc, argv); // Set window size glutInitWindowSize(640,480); // Set window position glutInitWindowPosition(10,10); // Set window display options glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE); // Set window name glutCreateWindow("Coursework 2"); create_textures(); glutReshapeFunc(Reshape); glutKeyboardFunc(Key); glutDisplayFunc(Render); glutIdleFunc(Idle); glutMainLoop(); return 0; } float Radians( float Angle_In_Degrees ) { return Angle_In_Degrees * 3.141593f / 180.0f; }