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