#include "Display.h" #include "Bitmap.h" #include "Glut/glut.h" #include "GL/gl.h" #include "GL/glu.h" #include "PoolLight.h" unsigned int Display::_textureHandles[_textureCount]; void Display::Init(int argc, char ** argv) { glutInit(&argc, argv); // initializes glut // sets display mode. These parameter set RGB colour model // and double buffering. glutInitWindowSize(800, 600); glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE); glutCreateWindow("200886396 - 3D Pool"); // Set glut callback functions glutDisplayFunc(Display::DisplayScene); glutIdleFunc(Display::Idle); glutReshapeFunc(Display::Resize); glutKeyboardFunc(Display::Keyboard); atexit(Display::Quit); glEnable(GL_TEXTURE_2D); glEnable(GL_DEPTH_TEST); glEnable(GL_LIGHTING); glPointSize(6); PoolLight spotlight = PoolLight(GL_LIGHT0, GL_DIFFUSE, 1, 1, 0.5, false, 0, 0, -4); spotlight.setSpotlight(10, 1, 0, 0, -1); spotlight = PoolLight(GL_LIGHT1, GL_DIFFUSE, 1, 1, 0.5, false, 0, 45, -4); spotlight.setSpotlight(10, 1, 0, 0, -1); spotlight = PoolLight(GL_LIGHT2, GL_DIFFUSE, 1, 1, 0.5, false, 0, -45, -4); spotlight.setSpotlight(10, 1, 0, 0, -1); glGenTextures(_textureCount, _textureHandles); //Generates 1 texture, puts the ID in m_TextureID //TODO: createTexture(Bitmap image, unsigned int textureID); // Begin glut main loop glutMainLoop(); } void Display::createTexture(Bitmap image, unsigned int textureID) { glBindTexture(GL_TEXTURE_2D, textureID); glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); gluBuild2DMipmaps(GL_TEXTURE_2D, 3, image.width, image.height, GL_RGB, GL_UNSIGNED_BYTE, image.data); //Copy image to graphics card } void Display::DisplayScene() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear the back buffer //glEnable(GL_TEXTURE_2D); drawPoolTable(); drawPoolRim(); drawPoolLegs(); //drawLighting(); //drawBalls(); //drawCue(); //glDisable(GL_TEXTURE_2D); glutSwapBuffers(); // Swap the front and back buffers } void Display::drawPoolTable() { //glBindTexture(GL_TEXTURE_2D, textureHandles[0]); glNormal3f(0, 0, 1); //Top face glBegin(GL_TRIANGLE_STRIP); for (int i = 90; i >= -90; i -= 10) { glColor3f(0, .5 + (float) abs(i) / 400, 0); glVertex3f(-45, i, -11); glVertex3f(45, i, -11); } glEnd(); glNormal3f(-1, 0, 0); //Left face glBegin(GL_TRIANGLE_STRIP); for (int i = 90; i >= -90; i -= 10) { glColor3f(.3 + (float) abs(i) / 400, .15 + (float) abs(i) / 400, 0); glVertex3f(-45, i, -11); glVertex3f(-45, i, -51); } glEnd(); glNormal3f(0, 1, 0); //Upper face glBegin(GL_TRIANGLE_STRIP); for (int i = 45; i >= -45; i -= 10) { glColor3f(.3 + (float) abs(i) / 200, .15 + (float) abs(i) / 200, 0); glVertex3f(i, 90, -11); glVertex3f(i, 90, -51); } glEnd(); glNormal3f(1, 0, 0); //Right face glBegin(GL_TRIANGLE_STRIP); for (int i = 90; i >= -90; i -= 10) { glColor3f(.3 + (float) abs(i) / 400, .15 + (float) abs(i) / 400, 0); glVertex3f(45, i, -11); glVertex3f(45, i, -51); } glEnd(); glNormal3f(0, -1, 0); //Lower face glBegin(GL_TRIANGLE_STRIP); for (int i = 45; i >= -45; i -= 10) { glColor3f(.3 + (float) abs(i) / 200, .15 + (float) abs(i) / 200, 0); glVertex3f(i, -90, -11); glVertex3f(i, -90, -51); } glEnd(); glNormal3f(0, 0, -1); //Bottom face glBegin(GL_TRIANGLE_STRIP); for (int i = 90; i >= -90; i -= 10) { glColor3f(.3 + (float) abs(i) / 400, .15 + (float) abs(i) / 400, 0); glVertex3f(-45, i, -51); glVertex3f(45, i, -51); } glEnd(); } void Display::drawPoolRim() { //glBindTexture(GL_TEXTURE_2D, textureHandles[0]); //Upper cuboid glBegin(GL_TRIANGLE_STRIP); glColor3f(0.2, 0, 0); //Top face glNormal3f(0, 0, 1); glVertex3f(-45, 90, -5); glVertex3f(45, 90, -5); glVertex3f(-45, 80, -5); glVertex3f(45, 80, -5); //Lower face glNormal3f(0, -1, 0); glVertex3f(-45, 80, -11); glVertex3f(45, 80, -11); //Bottom face glNormal3f(0, 0, -1); glVertex3f(-45, 90, -11); glVertex3f(45, 90, -11); //Upper face glNormal3f(0, 1, 0); glVertex3f(-45, 90, -5); glVertex3f(45, 90, -5); glEnd(); glBegin(GL_QUADS); //Left face glNormal3f(-1, 0, 0); glVertex3f(-45, 90, -5); glVertex3f(-45, 80, -5); glVertex3f(-45, 80, -11); glVertex3f(-45, 90, -11); //Right face glNormal3f(1, 0, 0); glVertex3f(45, 90, -5); glVertex3f(45, 80, -5); glVertex3f(45, 80, -11); glVertex3f(45, 90, -11); glEnd(); //Lower cuboid glBegin(GL_TRIANGLE_STRIP); glColor3f(0.2, 0, 0); //Top face glNormal3f(0, 0, 1); glVertex3f(-45, -90, -5); glVertex3f(45, -90, -5); glVertex3f(-45, -80, -5); glVertex3f(45, -80, -5); //Lower face glNormal3f(0, -1, 0); glVertex3f(-45, -80, -11); glVertex3f(45, -80, -11); //Bottom face glNormal3f(0, 0, -1); glVertex3f(-45, -90, -11); glVertex3f(45, -90, -11); //Upper face glNormal3f(0, 1, 0); glVertex3f(-45, -90, -5); glVertex3f(45, -90, -5); glEnd(); glBegin(GL_QUADS); //Left face glNormal3f(-1, 0, 0); glVertex3f(-45, -90, -5); glVertex3f(-45, -80, -5); glVertex3f(-45, -80, -11); glVertex3f(-45, -90, -11); //Right face glNormal3f(1, 0, 0); glVertex3f(45, -90, -5); glVertex3f(45, -80, -5); glVertex3f(45, -80, -11); glVertex3f(45, -90, -11); glEnd(); //Left cuboid glBegin(GL_TRIANGLE_STRIP); glColor3f(0.2, 0, 0); //Top face glNormal3f(0, 0, 1); glVertex3f(-35, 80, -5); glVertex3f(-45, 80, -5); glVertex3f(-35, -80, -5); glVertex3f(-45, -80, -5); //Lower face glNormal3f(0, -1, 0); glVertex3f(-35, -80, -11); glVertex3f(-45, -80, -11); //Bottom face glNormal3f(0, 0, -1); glVertex3f(-35, -80, -11); glVertex3f(-45, 80, -11); //Upper face glNormal3f(0, 1, 0); glVertex3f(-35, 80, -5); glVertex3f(-45, 80, -5); glEnd(); glBegin(GL_QUADS); //Left face glNormal3f(-1, 0, 0); glVertex3f(-45, 80, -5); glVertex3f(-45, -80, -5); glVertex3f(-45, -80, -11); glVertex3f(-45, 80, -11); //Right face glNormal3f(1, 0, 0); glVertex3f(-35, 80, -5); glVertex3f(-35, -80, -5); glVertex3f(-35, -80, -11); glVertex3f(-35, 80, -11); glEnd(); //Right cuboid glBegin(GL_TRIANGLE_STRIP); glColor3f(0.2, 0, 0); //Top face glNormal3f(0, 0, 1); glVertex3f(35, 80, -5); glVertex3f(45, 80, -5); glVertex3f(35, -80, -5); glVertex3f(45, -80, -5); //Lower face glNormal3f(0, -1, 0); glVertex3f(35, -80, -11); glVertex3f(45, -80, -11); //Bottom face glNormal3f(0, 0, -1); glVertex3f(35, -80, -11); glVertex3f(45, 80, -11); //Upper face glNormal3f(0, 1, 0); glVertex3f(35, 80, -5); glVertex3f(45, 80, -5); glEnd(); glBegin(GL_QUADS); //Left face glNormal3f(-1, 0, 0); glVertex3f(45, 80, -5); glVertex3f(45, -80, -5); glVertex3f(45, -80, -11); glVertex3f(45, 80, -11); //Right face glNormal3f(1, 0, 0); glVertex3f(35, 80, -5); glVertex3f(35, -80, -5); glVertex3f(35, -80, -11); glVertex3f(35, 80, -11); glEnd(); } void Display::drawPoolLegs() { //glBindTexture(GL_TEXTURE_2D, textureHandles[0]); //Upper Left Leg glBegin(GL_TRIANGLE_STRIP); //Upper face glNormal3f(0, 1, 0); glVertex3f(-45, 90, -51); glVertex3f(-45, 90, -151); glVertex3f(-25, 90, -51); glVertex3f(-25, 80, -151); //Right face glNormal3f(1, 0, 0); glVertex3f(-25, 65, -51); glVertex3f(-25, 65, -151); //Lower face glNormal3f(0, -1, 0); glVertex3f(-45, 65, -51); glVertex3f(-45, 65, -151); //Left face glNormal3f(-1, 0, 0); glVertex3f(-45, 90, -51); glVertex3f(-45, 90, -151); glEnd(); //Upper Right Leg glBegin(GL_TRIANGLE_STRIP); //Upper face glNormal3f(0, 1, 0); glVertex3f(45, 90, -51); glVertex3f(45, 90, -151); glVertex3f(25, 90, -51); glVertex3f(25, 80, -151); //Right face glNormal3f(1, 0, 0); glVertex3f(25, 65, -51); glVertex3f(25, 65, -151); //Lower face glNormal3f(0, -1, 0); glVertex3f(45, 65, -51); glVertex3f(45, 65, -151); //Left face glNormal3f(-1, 0, 0); glVertex3f(45, 90, -51); glVertex3f(45, 90, -151); glEnd(); //Lower Left Leg glBegin(GL_TRIANGLE_STRIP); //Upper face glNormal3f(0, 1, 0); glVertex3f(-45, -90, -51); glVertex3f(-45, -90, -151); glVertex3f(-25, -90, -51); glVertex3f(-25, -80, -151); //Right face glNormal3f(1, 0, 0); glVertex3f(-25, -65, -51); glVertex3f(-25, -65, -151); //Lower face glNormal3f(0, -1, 0); glVertex3f(-45, -65, -51); glVertex3f(-45, -65, -151); //Left face glNormal3f(-1, 0, 0); glVertex3f(-45, -90, -51); glVertex3f(-45, -90, -151); glEnd(); //Lower Right Leg glBegin(GL_TRIANGLE_STRIP); //Upper face glNormal3f(0, 1, 0); glVertex3f(45, -90, -51); glVertex3f(45, -90, -151); glVertex3f(25, -90, -51); glVertex3f(25, -80, -151); //Right face glNormal3f(1, 0, 0); glVertex3f(25, -65, -51); glVertex3f(25, -65, -151); //Lower face glNormal3f(0, -1, 0); glVertex3f(45, -65, -51); glVertex3f(45, -65, -151); //Left face glNormal3f(-1, 0, 0); glVertex3f(45, -90, -51); glVertex3f(45, -90, -151); glEnd(); } void Display::Resize(int w, int h) { /* Resize is called when window is resized */ glMatrixMode(GL_PROJECTION); glLoadIdentity(); glViewport(0,0,w,h); gluPerspective(85, (float)w/(float)h, 1, 1000); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(0, 0, 80, //Camera location 0, 0, -1, //Where to look at 1, 0, 0); //Camera 'up' direction } void Display::Idle() { /* When nothing else is happening, idle is called. * Simulation should be done here and then * the display method should be called */ glutPostRedisplay(); } void Display::Keyboard(unsigned char key, int x, int y) { //Look(); } void Display::Look() { } void Display::Quit() { glDeleteTextures(_textureCount, _textureHandles); }