All pastes #812031 Raw Edit

none

public text v1 · immutable
·published 2007-12-11 13:27 UTC
rendered paste body
// Car Park by Steven Pennington

#include <GL/GLUT.h>   //GLUT base library.
#include <gl/glu.h>
#include <Math.h>  // Maths library
#include <stdlib.h>

#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; }