From daa53760f3d7ee1dab2e08d785ca16ea29057b3b Mon Sep 17 00:00:00 2001 From: Krishna Date: Sun, 21 Mar 2010 21:55:08 -0400 Subject: [PATCH] A bunch of crap Broken shadow volumes Broken motion blurs Broken bump mapping --- Makefile | 4 +- algebra.hpp | 5 + appwindow.cpp | 2 +- game.cpp | 49 +-- game.hpp | 15 +- playButton.bmp | Bin 0 -> 240056 bytes playButtonClicked.bmp | Bin 0 -> 240056 bytes viewer.cpp | 959 ++++++++++++++++++++---------------------- viewer.hpp | 32 +- 9 files changed, 515 insertions(+), 551 deletions(-) create mode 100644 playButton.bmp create mode 100644 playButtonClicked.bmp diff --git a/Makefile b/Makefile index 82fc6bf..da94a9a 100644 --- a/Makefile +++ b/Makefile @@ -1,8 +1,8 @@ SOURCES = $(wildcard *.cpp) OBJECTS = $(SOURCES:.cpp=.o) DEPENDS = $(SOURCES:.cpp=.d) -LDFLAGS = $(shell pkg-config --libs gtkmm-2.4 gtkglextmm-1.2 sdl) -lglut -lsdl_mixer -CPPFLAGS = $(shell pkg-config --cflags gtkmm-2.4 gtkglextmm-1.2 sdl) +LDFLAGS = $(shell pkg-config --libs gtkmm-2.4 gtkglextmm-1.2 sdl libpng) -lglut -lsdl_mixer +CPPFLAGS = $(shell pkg-config --cflags gtkmm-2.4 gtkglextmm-1.2 sdl libpng) CXXFLAGS = $(CPPFLAGS) -W -Wall -g CXX = g++ -m32 MAIN = game488 diff --git a/algebra.hpp b/algebra.hpp index 9848adf..cf917ba 100644 --- a/algebra.hpp +++ b/algebra.hpp @@ -187,6 +187,11 @@ inline Point3D operator +(const Point3D& a, const Vector3D& b) return Point3D(a[0]+b[0], a[1]+b[1], a[2]+b[2]); } +inline bool operator ==(const Point3D& a, const Point3D& b) +{ + return (a[0] == b[0] && a[1] == b[1] && a[2] == b[2]); +} + inline Vector3D operator -(const Point3D& a, const Point3D& b) { return Vector3D(a[0]-b[0], a[1]-b[1], a[2]-b[2]); diff --git a/appwindow.cpp b/appwindow.cpp index efe63f9..9876952 100644 --- a/appwindow.cpp +++ b/appwindow.cpp @@ -22,10 +22,10 @@ AppWindow::AppWindow() // which shuts down the application. m_menu_app.items().push_back(MenuElem("_New Game", Gtk::AccelKey("n"), sigc::mem_fun(m_viewer, &Viewer::newGame ) ) ); m_menu_app.items().push_back(MenuElem("_Reset", Gtk::AccelKey("r"), sigc::mem_fun(m_viewer, &Viewer::resetView ) ) ); + m_menu_app.items().push_back(MenuElem("_Pause", Gtk::AccelKey("p"), sigc::mem_fun(m_viewer, &Viewer::pauseGame ) ) ); m_menu_app.items().push_back(MenuElem("_Quit", Gtk::AccelKey("q"), sigc::mem_fun(*this, &AppWindow::hide))); - m_menu_drawMode.items().push_back(MenuElem("_Wire-Frame", Gtk::AccelKey("w"), sigc::bind( draw_slot, Viewer::WIRE ) ) ); m_menu_drawMode.items().push_back(MenuElem("_Face", Gtk::AccelKey("f"), sigc::bind( draw_slot, Viewer::FACE ) ) ); m_menu_drawMode.items().push_back(MenuElem("_Texture 1", Gtk::AccelKey("t"), sigc::mem_fun(m_viewer, &Viewer::toggleTexture ) ) ); m_menu_drawMode.items().push_back(MenuElem("_Bump Mapping 1", Gtk::AccelKey("b"), sigc::mem_fun(m_viewer, &Viewer::toggleBumpMapping ) ) ); diff --git a/game.cpp b/game.cpp index c71d428..f59cd57 100644 --- a/game.cpp +++ b/game.cpp @@ -19,8 +19,7 @@ #define OBLOCKCOL 2 #define XCLEARBLOCKCOL 3 #define OCLEARBLOCKCOL 4 - -int counter = 0; +#define COUNTER_SPACE 16 int lastClearedRow = -1; static const Piece PIECES[] = { Piece( @@ -166,7 +165,7 @@ Game::Game(int width, int height) , score_(0) { int sz = board_width_ * (board_height_+4); - +counter=0; board_ = new int[ sz ]; std::fill(board_, board_ + sz, -1); generateNewPiece(); @@ -312,7 +311,6 @@ void Game::placePiece(const Piece& p, int x, int y) } } } -//dropShadowPiece(); } void Game::generateNewPiece() @@ -342,7 +340,7 @@ int Game::tick() markBlocksForClearing(); collapse(); moveClearBar(); - if (counter < 10) + if (counter < COUNTER_SPACE) { counter++; placePiece(piece_, px_, py_); @@ -385,10 +383,12 @@ int Game::tick() ++ny; placePiece(piece_, px_, ny);*/ dropPiece(0); + counter = COUNTER_SPACE; } else if(get(ny-2, px_+1) == -1 && get(ny-2, px_+2) != -1) { dropPiece(1); + counter = COUNTER_SPACE; } int rm = 0; /* int level = 1 + linesCleared_ / 10; @@ -418,6 +418,7 @@ int Game::tick() else { placePiece(piece_, px_, ny); + sy_ = py_; py_ = ny; return 0; } @@ -456,7 +457,8 @@ bool Game::moveLeft() removePiece(piece_, px_, py_); if(doesPieceFit(piece_, nx, py_)) { placePiece(piece_, nx, py_); - px_ = nx; + sx_ = px_; + px_ = nx; return true; } else { placePiece(piece_, px_, py_); @@ -471,7 +473,8 @@ bool Game::moveRight() removePiece(piece_, px_, py_); if(doesPieceFit(piece_, nx, py_)) { placePiece(piece_, nx, py_); - px_ = nx; + sx_ = px_; + px_ = nx; return true; } else { placePiece(piece_, px_, py_); @@ -503,6 +506,7 @@ bool Game::drop() } else { + sy_ = py_; py_ = ny; return true; } @@ -511,7 +515,6 @@ bool Game::drop() bool Game::rotateCW() { removePiece(piece_, px_, py_); - //removePiece(shadowPiece_, sx_, sy_); Piece npiece = piece_.rotateCW(); if(doesPieceFit(npiece, px_, py_)) @@ -531,7 +534,6 @@ bool Game::rotateCW() bool Game::rotateCCW() { removePiece(piece_, px_, py_); -// removePiece(shadowPiece_, sx_, sy_); Piece npiece = piece_.rotateCCW(); if(doesPieceFit(npiece, px_, py_)) { @@ -547,34 +549,7 @@ bool Game::rotateCCW() } } -void Game::dropShadowPiece() -{ - removePiece(shadowPiece_, sx_, sy_); - int ny = sy_; - sx_ = px_; - while(true) - { - --ny; - if(!doesPieceFit(shadowPiece_, sx_, ny)) - break; - } - - ++ny; - - for(int r = 0; r < 4; ++r) - { - for(int c = 0; c < 4; ++c) - { - if(shadowPiece_.isOn(r, c)) - get(ny-r, sx_+c) = shadowPiece_.getColourIndex(r, c); - } - } - - if(ny != sy_) - sy_ = ny; -} - -void Game::moveClearBar() +bool Game::moveClearBar() { if (clearBarPos > board_width_) { diff --git a/game.hpp b/game.hpp index e820fb0..428569b 100644 --- a/game.hpp +++ b/game.hpp @@ -35,7 +35,6 @@ class Piece { Piece rotateCCW() const; bool isOn(int row, int col) const; - int margins_[4]; void removeHalf(int side) { @@ -51,7 +50,7 @@ class Piece { desc_[ 2*4 + 2 ] = '.'; } } - + private: void getColumn(int col, char *buf) const; void getColumnRev(int col, char *buf) const; @@ -136,9 +135,12 @@ void dropShadowPiece(); return clearBarPos; } - void moveClearBar(); + bool moveClearBar(); void pullDown(int x, int y); - + int sx_, sy_; + int px_; + int py_; + int counter; private: bool doesPieceFit(const Piece& p, int x, int y) const; @@ -162,11 +164,10 @@ void dropShadowPiece(); Piece piece_; Piece shadowPiece_; - int px_, sx_; - int py_, sy_; - int* board_; + int* board_; + // Extra stuff int score_, linesCleared_; double clearBarPos; diff --git a/playButton.bmp b/playButton.bmp new file mode 100644 index 0000000000000000000000000000000000000000..3ae09f9e4cee15ff50df7a2946791f32b52a0460 GIT binary patch literal 240056 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 S5a1Bt5a1A4It2dbfBrxBYfYm7 literal 0 HcmV?d00001 diff --git a/playButtonClicked.bmp b/playButtonClicked.bmp new file mode 100644 index 0000000000000000000000000000000000000000..fea407350eca591d41735f985738842ae8f2964b GIT binary patch literal 240056 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 g%o;Fjz^nnY2Fw~TYrw1lvj)r>_-Sh3zx glconfig; @@ -63,7 +65,8 @@ Viewer::Viewer() // - Multisample rendering to smooth out edges glconfig = Gdk::GL::Config::create( Gdk::GL::MODE_RGB | Gdk::GL::MODE_DEPTH | - Gdk::GL::MODE_DOUBLE ); + Gdk::GL::MODE_DOUBLE | + Gdk::GL::MODE_ACCUM); if (glconfig == 0) { // If we can't get this configuration, die abort(); @@ -125,6 +128,8 @@ void Viewer::on_realize() LoadGLTextures("black.bmp", texture[4]); LoadGLTextures("normal.bmp", bumpMap); LoadGLTextures("floor.bmp", floorTexId); + LoadGLTextures("playButton.bmp", playButtonTex); + LoadGLTextures("playButtonClicked.bmp", playButtonClickedTex); std::cout << "normal\t" << bumpMap << "\n"; @@ -161,15 +166,22 @@ void Viewer::on_realize() glClearColor(0.7, 0.7, 1.0, 0.0); - -/* backgroundSoundBuf = sm.LoadWav("OBS.wav"); - backgroundSoundIndex = sm.MakeSource(); - sm.QueueBuffer(backgroundSoundIndex, backgroundSoundBuf); - - backgroundSoundBuf = sm.LoadWav("cutman.wav"); - backgroundSoundIndex = sm.MakeSource(); - sm.QueueBuffer(backgroundSoundIndex, backgroundSoundBuf);*/ - + square = glGenLists(1); + glNewList(square, GL_COMPILE); + glBegin(GL_QUADS); + glTexCoord2f(0.0f, 0.0f); + glVertex3d(0, 0, 1); + + glTexCoord2f(1.0f, 0.0f); + glVertex3d(1, 0, 1); + + glTexCoord2f(1.0f, 1.0f); + glVertex3d(1, 1, 1); + + glTexCoord2f(0.0f, 1.0f); + glVertex3d(0, 1, 1); + glEnd(); + glEndList(); gldrawable->gl_end(); } @@ -191,7 +203,7 @@ bool Viewer::on_expose_event(GdkEventExpose* event) // Clear the screen - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_ACCUM_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); // Modify the current projection matrix so that we move the // camera away from the origin. We'll draw the game at the @@ -211,12 +223,8 @@ bool Viewer::on_expose_event(GdkEventExpose* event) // Initialize lighting settings glShadeModel(GL_SMOOTH); glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); - glEnable(GL_LIGHTING); // Create one light source - glEnable(GL_LIGHT0); - glEnable(GL_COLOR_MATERIAL); - glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE); // Define properties of light /* float ambientLight0[] = { 0.3f, 0.3f, 0.3f, 1.0f }; float diffuseLight0[] = { 0.8f, 0.8f, 0.8f, 1.0f }; @@ -227,6 +235,7 @@ bool Viewer::on_expose_event(GdkEventExpose* event) glLightfv(GL_LIGHT0, GL_SPECULAR, specularLight0); glLightfv(GL_LIGHT0, GL_POSITION, position0); */ + // Scale and rotate the scene if (scaleFactor != 1) @@ -239,7 +248,7 @@ bool Viewer::on_expose_event(GdkEventExpose* event) glRotated(rotationAngleY, 0, 1, 0); if (rotationAngleZ != 0) - glRotated(rotationAngleZ, 0, 0, 1); + glTranslatef(rotationAngleZ, 0, 0); // Increment rotation angles for next render if ((mouseB1Down && !shiftIsDown) || rotateAboutX) @@ -268,6 +277,7 @@ bool Viewer::on_expose_event(GdkEventExpose* event) glTranslated(-5.0, -10.0, 10.0); // Create one light source + glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glEnable(GL_COLOR_MATERIAL); glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE); @@ -275,18 +285,15 @@ bool Viewer::on_expose_event(GdkEventExpose* event) float ambientLight0[] = { 0.3f, 0.3f, 0.3f, 1.0f }; float diffuseLight0[] = { 0.8f, 0.8f, 0.8f, 1.0f }; float specularLight0[] = { 0.6f, 0.6f, 0.6f, 1.0f }; - float position0[] = { 20.0f, 5.0f, 2.0f, 1.0f }; - lightPos[0] = 20.0; - lightPos[1] = 5.0; - lightPos[2] = 2.0; + glLightfv(GL_LIGHT0, GL_AMBIENT, ambientLight0); glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseLight0); glLightfv(GL_LIGHT0, GL_SPECULAR, specularLight0); - glLightfv(GL_LIGHT0, GL_POSITION, position0); + glLightfv(GL_LIGHT0, GL_POSITION, lightPos); if (loadScreen) { - draw_start_screen(false); + drawStartScreen(false, playButtonTex); // We pushed a matrix onto the PROJECTION stack earlier, we // need to pop it. @@ -298,120 +305,431 @@ bool Viewer::on_expose_event(GdkEventExpose* event) // just drew. This should only be done if double buffering is enabled. if (doubleBuffer) gldrawable->swap_buffers(); - else - glFlush(); +/* else + glFlush(); */ gldrawable->gl_end(); return true; } + +/* // Draw game + drawFloor(); + drawScene(0); +// + + + glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); + glDepthMask(GL_FALSE); + glEnable(GL_CULL_FACE); + glEnable(GL_STENCIL_TEST); + glEnable(GL_POLYGON_OFFSET_FILL); + glPolygonOffset(0.0f, 100.0f); + + glCullFace(GL_FRONT); + glStencilFunc(GL_ALWAYS, 0x0, 0xff); + glStencilOp(GL_KEEP, GL_INCR, GL_KEEP); + drawShadowVolumes(); + + glCullFace(GL_BACK); + glStencilFunc(GL_ALWAYS, 0x0, 0xff); + glStencilOp(GL_KEEP, GL_DECR, GL_KEEP); + drawShadowVolumes(); + + glDisable(GL_POLYGON_OFFSET_FILL); + glDisable(GL_CULL_FACE); + glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); + glDepthMask(GL_TRUE); + + glStencilFunc(GL_NOTEQUAL, 0x0, 0xff); + glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE); +/* glPushMatrix(); + glLoadIdentity(); + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + glLoadIdentity(); + glOrtho(0, 1, 1, 0, 0, 1); + glDisable(GL_DEPTH_TEST); + + glColor4f(0.0f, 0.0f, 0.0f, 0.5f); + glBegin(GL_QUADS); + glVertex2i(0, 0); + glVertex2i(0, 1); + glVertex2i(1, 1); + glVertex2i(1, 0); + glEnd(); + + glEnable(GL_DEPTH_TEST); + glPopMatrix(); + glMatrixMode(GL_MODELVIEW); + glPopMatrix(); + glDisable(GL_STENCIL_TEST); - glBegin(GL_LINE_LOOP); - glVertex3d(game->getClearBarPos(), 0, 0); - glVertex3d(game->getClearBarPos(), 0, 1); - glVertex3d(game->getClearBarPos(), HEIGHT, 1); - glVertex3d(game->getClearBarPos(), HEIGHT, 0); - glEnd(); + drawFloor();*/ + +/* glColor4f(0.7f, 0.4f, 0.0f, 1.0f); // Set Color To An Orange + glDisable(GL_LIGHTING); // Disable Lighting + glDepthMask(GL_FALSE); // Disable Depth Mask + glTranslatef(lightPos[0], lightPos[1], lightPos[2]); // Translate To Light's Position + + GLUquadricObj *quadratic; + quadratic=gluNewQuadric(); // Notice We're Still In Local Coordinate System + gluSphere(quadratic, 0.2f, 16, 8); // Draw A Little Yellow Sphere (Represents Light) +// glEnable(GL_LIGHTING); // Enable Lighting + glDepthMask(GL_TRUE); // Enable Depth Mask*/ + + + GLUquadricObj *quadratic; + quadratic=gluNewQuadric(); // Create A Pointer To The Quadric Object ( NEW ) + gluQuadricNormals(quadratic, GLU_SMOOTH); // Create Smooth Normals ( NEW ) + gluQuadricTexture(quadratic, GL_TRUE); + glPushMatrix(); + glTranslatef(lightPos[0], lightPos[1], lightPos[2]); + gluSphere(quadratic,1.3f,32,32); + glPopMatrix(); - // Draw Floor -/* glEnable(GL_TEXTURE_2D); - glBindTexture(GL_TEXTURE_2D, floorTexId); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT ); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );*/ - glColor3d(1, 1, 1); - glBegin(GL_QUADS); -// glTexCoord2f(0.0, 0.0); - glVertex3d(-100, -1, -100); -// glTexCoord2f(0.0, 10.0); - glVertex3d(-100, -1, 100); -// glTexCoord2f(10.0, 10.0); - glVertex3d(100, -1, 100); -// glTexCoord2f(10.0, 0.0); - glVertex3d(100, -1, -100); - glEnd(); - glBindTexture(GL_TEXTURE_2D, 0); - glDisable(GL_TEXTURE_2D); - // Draw Border - for (int y = -1;y< HEIGHT;y++) + +// drawShadowVolumes(); +// silhouette.clear(); + +// drawRoom(); + + //drawScene(0); + drawBar(); + + if (game->counter == 15) { - drawCube(y, -1, 7, GL_LINE_LOOP); + drawScene(0); + drawFallingBox(); + + glAccum(GL_RETURN, 1.f); + } + else + drawScene(0); + + +/* for (int i = 16;i>=1;i--) + { + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + // drawBar(i); + drawScene(i); + glAccum(GL_ACCUM, 1.f/16); + } + glAccum(GL_RETURN, 1.f); */ + - drawCube(y, WIDTH, 7, GL_LINE_LOOP); + // We pushed a matrix onto the PROJECTION stack earlier, we + // need to pop it. + + glMatrixMode(GL_PROJECTION); + glPopMatrix(); + + // Swap the contents of the front and back buffers so we see what we + // just drew. This should only be done if double buffering is enabled. + if (doubleBuffer) + gldrawable->swap_buffers(); +/* else + glFlush(); */ + + gldrawable->gl_end(); + + return true; +} + +void Viewer::drawRoom() // Draw The Room (Box) +{ + glColor3d(0, 1, 0); + glBegin(GL_QUADS); // Begin Drawing Quads + // Floor + glNormal3f(0.0f, 1.0f, 0.0f); // Normal Pointing Up + glVertex3f(-4.0f,0.0f,-20.0f); // Back Left + glVertex3f(-4.0f,0.0f, 20.0f); // Front Left + glVertex3f( 20.0f,0.0f, 20.0f); // Front Right + glVertex3f( 20.0f,0.0f,-20.0f); // Back Right + // Ceiling + glNormal3f(0.0f,-1.0f, 0.0f); // Normal Point Down + glVertex3f(-4.0f, 20.0f, 20.0f); // Front Left + glVertex3f(-4.0f, 20.0f,-20.0f); // Back Left + glVertex3f( 20.0f, 20.0f,-20.0f); // Back Right + glVertex3f( 20.0f, 20.0f, 20.0f); // Front Right + // Front Wall + glNormal3f(0.0f, 0.0f, 1.0f); // Normal Pointing Away From Viewer + glVertex3f(-4.0f, 20.0f,-20.0f); // Top Left + glVertex3f(-4.0f, 0.0f,-20.0f); // Bottom Left + glVertex3f( 20.0f, 0.0f,-20.0f); // Bottom Right + glVertex3f( 20.0f, 20.0f,-20.0f); // Top Right +/* // Back Wall + glNormal3f(0.0f, 0.0f,-1.0f); // Normal Pointing Towards Viewer + glVertex3f( 20.0f, 15.0f, 20.0f); // Top Right + glVertex3f( 20.0f,-15.0f, 20.0f); // Bottom Right + glVertex3f(-20.0f,-15.0f, 20.0f); // Bottom Left + glVertex3f(-20.0f, 15.0f, 20.0f); // Top Left*/ + // Left Wall + glNormal3f(1.0f, 0.0f, 0.0f); // Normal Pointing Right + glVertex3f(-4.0f, 20.0f, 20.0f); // Top Front + glVertex3f(-4.0f, 0.0f, 20.0f); // Bottom Front + glVertex3f(-4.0f, 0.0f,-20.0f); // Bottom Back + glVertex3f(-4.0f, 20.0f,-20.0f); // Top Back + // Right Wall + glNormal3f(-1.0f, 0.0f, 0.0f); // Normal Pointing Left + glVertex3f( 20.0f, 20.0f,-20.0f); // Top Back + glVertex3f( 20.0f, 0.0f,-20.0f); // Bottom Back + glVertex3f( 20.0f, 0.0f, 20.0f); // Bottom Front + glVertex3f( 20.0f, 20.0f, 20.0f); // Top Front + glEnd(); // Done Drawing Quads +} +void Viewer::drawShadowVolumes() +{ + float frac = 1.f/16; + for (int i = HEIGHT+3;i>=0;i--) // row + { + for (int j = WIDTH - 1; j>=0;j--) // column + { + + bool condition = game->get(i, j) != -1 && i > 1 &&( game->get(i - 2, j) == -1 && i == game->py_ - 1 && j == game->px_ + 1 + || game->get(i - 2, j) == -1 && i == game->py_ - 1 && j == game->px_ + 2); + condition = condition || (i > 0 && game->get(i - 1, j) == -1 && i == game->py_ - 2 && j == game->px_ + 1 || game->get(i - 1, j) == -1 && i == game->py_ - 2 && j == game->px_ + 2); + if (condition) + { + drawShadowCube (i - game->counter * frac, j, GL_LINE_LOOP ); + + } + else if (game->get(i, j) != -1) + { + drawShadowCube (i, j, GL_QUADS ); + + } + + + // Draw outline for cube + } } - for (int x = 0;x < WIDTH; x++) + + + Vector3D temp, temp2; + Point3D temp3; + Point3D lightPoint(lightPos[0], lightPos[1], lightPos[2]); + glColor4d(0, 0, 0, 0.3); + glBegin(GL_QUADS); + for (int i = 0;i 0) + { + silhouette.push_back(std::pair(a, b )); + silhouette.push_back(std::pair(c, b )); + silhouette.push_back(std::pair(c, d )); + silhouette.push_back(std::pair(d, a)); + } + +/* if (Vector3D(0, 1, 0).dot(lightVec) > 0) + { + silhouette.push_back(std::pair(c, d) ); + silhouette.push_back(std::pair(c, g) ); + silhouette.push_back(std::pair(g, h) ); + silhouette.push_back(std::pair(h, d) ); + } + + - // Draw current state of Lumines - if (currentDrawMode == Viewer::WIRE) + if (Vector3D(1, 0, 0).dot(lightVec) > 0) { - for (int i = HEIGHT + 3;i>=0;i--) // row + silhouette.push_back(std::pair(b, f) ); + silhouette.push_back(std::pair(c, g) ); + silhouette.push_back(std::pair(b, c) ); + silhouette.push_back(std::pair(g, f) ); + } + */ + if (Vector3D(-1, 0, 0).dot(lightVec) > 0) + { + silhouette.push_back(std::pair(a, e) ); + silhouette.push_back(std::pair(d, h) ); + silhouette.push_back(std::pair(a, d) ); + silhouette.push_back(std::pair(h, e) ); + std::cerr << "left face " << Vector3D(-1, 0, 0).dot(lightVec) << "\n"; + } + + if (Vector3D(0, -1, 0).dot(lightVec) > 0) + { + silhouette.push_back(std::pair(b, a) ); + silhouette.push_back(std::pair(b, f) ); + silhouette.push_back(std::pair(f, e) ); + silhouette.push_back(std::pair(e, a) ); + std::cerr << "bottom face " << Vector3D(0, -1, 0).dot(lightVec) << "\n"; + } + + if (Vector3D(0, 0, -1).dot(lightVec) > 0) + { + silhouette.push_back(std::pair(e, f) ); + silhouette.push_back(std::pair(g, f) ); + silhouette.push_back(std::pair(g, h) ); + silhouette.push_back(std::pair(h, e) ); + std::cerr << "back face " << Vector3D(0, 0, -1).dot(lightVec) << "\n"; + } + for (int i = 0;i=0;j--) // column + if (silhouette[i].first == silhouette[j].first && silhouette[i].second == silhouette[j].second) { - drawCube (i, j, game->get(i, j), GL_LINE_LOOP ); + // std::cerr << silhouette[i].first << "\t" << silhouette[j].first << "\t" << silhouette[i].second << "\t" << silhouette[j].second << std::endl; + silhouette.erase (silhouette.begin() + i); + silhouette.erase (silhouette.begin() + j-1); + break; + } + else if (silhouette[i].first == silhouette[j].second && silhouette[i].second == silhouette[j].first) + { + // std::cerr << silhouette[i].first << "\t" << silhouette[j].second << "\t" << silhouette[i].second << "\t" << silhouette[j].first << std::endl; + silhouette.erase (silhouette.begin() + i); + silhouette.erase (silhouette.begin() + j-1); + break; } } } - else if (currentDrawMode == Viewer::MULTICOLOURED) + +} + +void Viewer::drawBar() +{ + // Clear bar + glBegin(GL_LINE_LOOP); + glVertex3d(game->getClearBarPos(), 0, 0); + glVertex3d(game->getClearBarPos(), 0, 1); + glVertex3d(game->getClearBarPos(), HEIGHT, 1); + glVertex3d(game->getClearBarPos(), HEIGHT, 0); + glEnd(); +} + +void Viewer::drawFallingBox() +{ + + int iter = 16; + float iterFrac = 1.f/iter; + for (int i = 0;i=0;i--) // row + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + drawCube (game->py_ - 1 + i * iterFrac, game->px_ + 1, game->get(game->py_ - 1, game->px_ + 1), GL_QUADS ); + drawCube (game->py_ - 1 + i * iterFrac, game->px_ + 2, game->get(game->py_ - 1, game->px_ + 2), GL_QUADS ); + drawCube (game->py_ - 2 + i * iterFrac, game->px_ + 1, game->get(game->py_ - 1, game->px_ + 1), GL_QUADS ); + drawCube (game->py_ - 2 + i * iterFrac, game->px_ + 2, game->get(game->py_ - 1, game->px_ + 2), GL_QUADS ); + + drawCube (game->py_ - 1 + i * iterFrac, game->px_ + 1, 7, GL_LINE_LOOP ); + drawCube (game->py_ - 1 + i * iterFrac, game->px_ + 2, 7, GL_LINE_LOOP ); + drawCube (game->py_ - 2 + i * iterFrac, game->px_ + 1, 7, GL_LINE_LOOP ); + drawCube (game->py_ - 2 + i * iterFrac, game->px_ + 2, 7, GL_LINE_LOOP ); + glAccum(GL_ACCUM, iterFrac); + } + +} + +void Viewer::drawFloor() +{ + // Draw Floor + // glEnable(GL_TEXTURE_2D); + // glBindTexture(GL_TEXTURE_2D, floorTexId); + // glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT ); + // glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT ); + glColor3d(1, 1, 1); + glBegin(GL_QUADS); + glNormal3f(0.0, 1.0, 0.0); + // glTexCoord2f(0.0, 0.0); + glVertex3d(-100, -1, -100); + // glTexCoord2f(0.0, 10.0); + glVertex3d(-100, -1, 100); + // glTexCoord2f(10.0, 10.0); + glVertex3d(100, -1, 100); + // glTexCoord2f(10.0, 0.0); + glVertex3d(100, -1, -100); + glEnd(); + // glBindTexture(GL_TEXTURE_2D, 0); + // glDisable(GL_TEXTURE_2D); +} +void Viewer::drawScene(int itesdfr) +{ + + // Draw Border + for (int y = -1;y< HEIGHT;y++) { - for (int j = WIDTH - 1; j>=0;j--) // column - { - // Draw outline for cube - if (game->get(i, j) != -1) - drawCube(i, j, 7, GL_LINE_LOOP); - - drawCube (i, j, game->get(i, j), GL_QUADS, true ); - } + drawCube(y, -1, 7, GL_LINE_LOOP); + + drawCube(y, WIDTH, 7, GL_LINE_LOOP); } - } - else if (currentDrawMode == Viewer::FACE) - { + for (int x = 0;x < WIDTH; x++) + { + drawCube (-1, x, 7, GL_LINE_LOOP); + } + + + + + float frac = 1.f/16; for (int i = HEIGHT+3;i>=0;i--) // row { for (int j = WIDTH - 1; j>=0;j--) // column { - - if (loadBumpMapping) - drawBumpCube(i, j, game->get(i,j), GL_QUADS); - else + bool condition = i > 1 &&( game->get(i - 2, j) == -1 && i == game->py_ - 1 && j == game->px_ + 1 + || game->get(i - 2, j) == -1 && i == game->py_ - 1 && j == game->px_ + 2); + condition = condition || (i > 0 && game->get(i - 1, j) == -1 && i == game->py_ - 2 && j == game->px_ + 1 || game->get(i - 1, j) == -1 && i == game->py_ - 2 && j == game->px_ + 2); + /*if (condition) + { + drawCube (i - game->counter * frac, j, game->get(i, j), GL_QUADS ); + } + else*/ if(game->get(i, j) != -1) drawCube (i, j, game->get(i, j), GL_QUADS ); - + // Draw outline for cube - if (game->get(i, j) != -1) + /*if (game->get(i, j) != -1 && condition) + { + + drawCube(i - game->counter * frac, j, 7, GL_LINE_LOOP); + } + else */if (game->get(i, j) != -1) drawCube(i, j, 7, GL_LINE_LOOP); } } - } - - if (gameOver) - { - // Some game over animation - } - - // We pushed a matrix onto the PROJECTION stack earlier, we - // need to pop it. - - glMatrixMode(GL_PROJECTION); - glPopMatrix(); - - // Swap the contents of the front and back buffers so we see what we - // just drew. This should only be done if double buffering is enabled. - if (doubleBuffer) - gldrawable->swap_buffers(); - else - glFlush(); - - gldrawable->gl_end(); - - return true; + + if (gameOver) + { + // Some game over animation + } } - bool Viewer::on_configure_event(GdkEventConfigure* event) { Glib::RefPtr gldrawable = get_gl_drawable(); @@ -461,7 +779,7 @@ bool Viewer::on_button_press_event(GdkEventButton* event) glTranslated(-5.0, -12.0, 0.0); glInitNames(); glPushName(0); - draw_start_screen(true); + drawStartScreen(true, playButtonTex); glMatrixMode(GL_PROJECTION); glPopMatrix(); glMatrixMode(GL_MODELVIEW); @@ -476,7 +794,10 @@ bool Viewer::on_button_press_event(GdkEventButton* event) if (hits > 0) { - loadScreen = false; + clickedButton = true; + playButtonTex = playButtonClickedTex; + drawStartScreen(false, playButtonClickedTex); + invalidate(); } } // Stop rotating if a mosue button was clicked and the shift button is not down @@ -508,7 +829,11 @@ bool Viewer::on_button_release_event(GdkEventButton* event) { startScalePos[0] = 0; startScalePos[1] = 0; - + if (clickedButton) + { + loadScreen = false; + } + if (!shiftIsDown) { // Set the rotation speed based on how far the cursor has moved since the mouse down event @@ -565,8 +890,6 @@ bool Viewer::on_motion_notify_event(GdkEventMotion* event) if (scaleFactor < 0.5) scaleFactor = 0.5; - else if (scaleFactor > 2) - scaleFactor = 2; startScalePos[0] = event->x; startScalePos[1] = event->y; @@ -601,7 +924,7 @@ bool Viewer::on_motion_notify_event(GdkEventMotion* event) return true; } -void Viewer::drawCube(int y, int x, int colourId, GLenum mode, bool multiColour) +void Viewer::drawCube(float y, float x, int colourId, GLenum mode, bool multiColour) { if (mode == GL_LINE_LOOP) glLineWidth (1.2); @@ -687,7 +1010,9 @@ void Viewer::drawCube(int y, int x, int colourId, GLenum mode, bool multiColour) { glColor3d(r, g, b); } + + glBegin(mode); glTexCoord2f(0.0f, 0.0f); glVertex3d(innerXMin + x, innerYMin + y, zMax); @@ -778,300 +1103,6 @@ void Viewer::drawCube(int y, int x, int colourId, GLenum mode, bool multiColour) } -void Viewer::drawBumpCube(int y, int x, int colourId, GLenum mode, bool multiColour) -{ - if (mode == GL_LINE_LOOP) - glLineWidth (1.2); - - double r, g, b; - r = 0; - g = 0; - b = 0; - switch (colourId) - { - case 0: // blue - r = 0.514; - g = 0.839; - b = 0.965; - break; - case 1: // purple - r = 0.553; - g = 0.6; - b = 0.796; - break; - case 2: // orange - r = 0.988; - g = 0.627; - b = 0.373; - break; - case 3: // green - r = 0.69; - g = 0.835; - b = 0.529; - break; - case 4: // red - r = 1.00; - g = 0.453; - b = 0.339; - break; - case 5: // pink - r = 0.949; - g = 0.388; - b = 0.639; - break; - case 6: // yellow - r = 1; - g = 0.792; - b = 0.204; - break; - case 7: // black - r = 0; - g = r; - b = g; - break; - default: - return; - } - - double innerXMin = 0; - double innerYMin = 0; - double innerXMax = 1; - double innerYMax = 1; - double zMax = 1; - double zMin = 0; - - -// glNormal3d(1, 0, 0); - glBlendFunc(GL_DST_COLOR, GL_ZERO); - glEnable(GL_BLEND); - // Set The First Texture Unit To Normalize Our Vector From The Surface To The Light. - // Set The Texture Environment Of The First Texture Unit To Replace It With The - // Sampled Value Of The Normalization Cube Map. - glActiveTexture(GL_TEXTURE0); - glEnable(GL_TEXTURE_CUBE_MAP); - glBindTexture(GL_TEXTURE_CUBE_MAP, normalization_cube_map); - glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); - glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_REPLACE) ; - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_TEXTURE) ; - - // Set The Second Unit To The Bump Map. - // Set The Texture Environment Of The Second Texture Unit To Perform A Dot3 - // Operation With The Value Of The Previous Texture Unit (The Normalized - // Vector Form The Surface To The Light) And The Sampled Texture Value (The - // Normalized Normal Vector Of Our Bump Map). - glActiveTexture(GL_TEXTURE1); - glEnable(GL_TEXTURE_2D); - glBindTexture(GL_TEXTURE_2D, bumpMap); - glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); - glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_DOT3_RGB) ; - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_PREVIOUS) ; - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_TEXTURE) ; - - // Set The Third Texture Unit To Our Tefsxture. - // Set The Texture Environment Of The Third Texture Unit To Modulate - // (Multiply) The Result Of Our Dot3 Operation With The Texture Value. - glActiveTexture(GL_TEXTURE2); - glEnable(GL_TEXTURE_2D); - glBindTexture(GL_TEXTURE_2D, texture[colourId - 1]); - glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); - - - //glBindTexture(GL_TEXTURE_2D, texture[colourId - 1]); - - - - double vertex_to_light_x, vertex_to_light_y, vertex_to_light_z; - vertex_to_light_z = lightPos[2] - zMax; - glBegin(mode); - Vector3D temp = lightPos - Point3D(innerXMin + x, innerYMin + y, zMax); - temp.normalize(); - std::cout << temp << "\n"; - glMultiTexCoord3d(GL_TEXTURE0, temp[0], temp[1], temp[2]); - glMultiTexCoord2d(GL_TEXTURE1, 0.0, 0.0); - glMultiTexCoord2d(GL_TEXTURE2, 0.0, 0.0); - glVertex3d(innerXMin + x, innerYMin + y, zMax); - - temp = lightPos - Point3D(innerXMax + x, innerYMin + y, zMax); - temp.normalize(); - glMultiTexCoord3d(GL_TEXTURE0, temp[0], temp[1], temp[2]); - glMultiTexCoord2d(GL_TEXTURE1, 1.0, 0.0); - glMultiTexCoord2d(GL_TEXTURE2, 1.0, 0.0); - glVertex3d(innerXMax + x, innerYMin + y, zMax); - - temp = lightPos - Point3D(innerXMax + x, innerYMax + y, zMax); - temp.normalize(); - glMultiTexCoord3d(GL_TEXTURE0, temp[0], temp[1], temp[2]); - glMultiTexCoord2d(GL_TEXTURE1, 1.0, 1.0); - glMultiTexCoord2d(GL_TEXTURE2, 1.0, 1.0); - glVertex3d(innerXMax + x, innerYMax + y, zMax); - - - temp = lightPos - Point3D(innerXMax + x, innerYMax + y, zMax); - temp.normalize(); - glMultiTexCoord3d(GL_TEXTURE0, temp[0], temp[1], temp[2]); - glMultiTexCoord2d(GL_TEXTURE1, 0.0, 1.0); - glMultiTexCoord2d(GL_TEXTURE2, 0.0, 1.0); - glVertex3d(innerXMin + x, innerYMax + y, zMax); - glEnd(); - - // top face - - glBegin(mode); - temp = lightPos - Point3D(innerXMin + x, innerYMax + y, zMin); - temp.normalize(); - vertex_to_light_x = lightPos[0] - (innerXMin + x); - vertex_to_light_y = lightPos[1] - (innerYMax + y); - glMultiTexCoord3d(GL_TEXTURE0, temp[0], temp[1], temp[2]); - glMultiTexCoord2d(GL_TEXTURE1, 0.0, 0.0); - glMultiTexCoord2d(GL_TEXTURE2, 0.0, 0.0); - glVertex3d(innerXMin + x, innerYMax + y, zMin); - - temp = lightPos - Point3D(innerXMax + x, innerYMax + y, zMin); - temp.normalize(); - glMultiTexCoord3d(GL_TEXTURE0, temp[0], temp[1], temp[2]); - glMultiTexCoord2d(GL_TEXTURE1, 1.0, 0.0); - glMultiTexCoord2d(GL_TEXTURE2, 1.0, 0.0); - glVertex3d(innerXMax + x, innerYMax + y, zMin); - - temp = lightPos - Point3D(innerXMax + x, innerYMax + y, zMax); - temp.normalize(); - glMultiTexCoord3d(GL_TEXTURE0, temp[0], temp[1], temp[2]); - glMultiTexCoord2d(GL_TEXTURE1, 1.0, 0.0); - glMultiTexCoord2d(GL_TEXTURE2, 1.0, 0.0); - glVertex3d(innerXMax + x, innerYMax + y, zMax); - - temp = lightPos - Point3D(innerXMin + x, innerYMax + y, zMax); - temp.normalize(); - glMultiTexCoord3d(GL_TEXTURE0, temp[0], temp[1], temp[2]); - glMultiTexCoord2d(GL_TEXTURE1, 1.0, 0.0); - glMultiTexCoord2d(GL_TEXTURE2, 1.0, 0.0); - glVertex3d(innerXMin + x, innerYMax + y, zMax); - glEnd(); - - // left face - - glBegin(mode); - temp = lightPos - Point3D(innerXMin + x, innerYMin + y, zMin); - temp.normalize(); - vertex_to_light_x = lightPos[0] - (innerXMin + x); - vertex_to_light_y = lightPos[1] - (innerYMin + y); - glMultiTexCoord3d(GL_TEXTURE0, temp[0], temp[1], temp[2]); - glMultiTexCoord2d(GL_TEXTURE1, 0.0, 0.0); - glMultiTexCoord2d(GL_TEXTURE2, 0.0, 0.0); - glVertex3d(innerXMin + x, innerYMin + y, zMin); - - temp = lightPos - Point3D(innerXMin + x, innerYMax + y, zMin); - temp.normalize(); - glMultiTexCoord3d(GL_TEXTURE0, temp[0], temp[1], temp[2]); - glMultiTexCoord2d(GL_TEXTURE1, 1.0, 0.0); - glMultiTexCoord2d(GL_TEXTURE2, 1.0, 0.0); - glVertex3d(innerXMin + x, innerYMax + y, zMin); - - temp = lightPos - Point3D(innerXMin + x, innerYMax + y, zMax); - temp.normalize(); - glMultiTexCoord3d(GL_TEXTURE0, temp[0], temp[1], temp[2]); - glMultiTexCoord2d(GL_TEXTURE1, 1.0, 0.0); - glMultiTexCoord2d(GL_TEXTURE2, 1.0, 0.0); - glVertex3d(innerXMin + x, innerYMax + y, zMax); - - temp = lightPos - Point3D(innerXMin + x, innerYMin + y, zMax); - temp.normalize(); - glMultiTexCoord3d(GL_TEXTURE0, temp[0], temp[1], temp[2]); - glMultiTexCoord2d(GL_TEXTURE1, 1.0, 0.0); - glMultiTexCoord2d(GL_TEXTURE2, 1.0, 0.0); - glVertex3d(innerXMin + x, innerYMin + y, zMax); - glEnd(); - - // bottom face - - - glBegin(mode); - temp = lightPos - Point3D(innerXMin + x, innerYMin + y, zMin); - temp.normalize(); - vertex_to_light_x = lightPos[0] - (innerXMin + x); - vertex_to_light_y = lightPos[1] - (innerYMin + y); - glMultiTexCoord3d(GL_TEXTURE0, temp[0], temp[1], temp[2]); - glMultiTexCoord2d(GL_TEXTURE1, 0.0, 0.0); - glMultiTexCoord2d(GL_TEXTURE2, 0.0, 0.0); - glVertex3d(innerXMin + x, innerYMin + y, zMin); - - temp = lightPos - Point3D(innerXMax + x, innerYMin + y, zMin); - temp.normalize(); - glMultiTexCoord3d(GL_TEXTURE0, temp[0], temp[1], temp[2]); - glMultiTexCoord2d(GL_TEXTURE1, 1.0, 0.0); - glMultiTexCoord2d(GL_TEXTURE2, 1.0, 0.0); - glVertex3d(innerXMax + x, innerYMin + y, zMin); - - temp = lightPos - Point3D(innerXMax + x, innerYMin + y, zMax); - temp.normalize(); - glMultiTexCoord3d(GL_TEXTURE0, temp[0], temp[1], temp[2]); - glMultiTexCoord2d(GL_TEXTURE1, 1.0, 0.0); - glMultiTexCoord2d(GL_TEXTURE2, 1.0, 0.0); - glVertex3d(innerXMax + x, innerYMin + y, zMax); - - temp = lightPos - Point3D(innerXMin + x, innerYMin + y, zMax); - temp.normalize(); - glMultiTexCoord3d(GL_TEXTURE0, temp[0], temp[1], temp[2]); - glMultiTexCoord2d(GL_TEXTURE1, 1.0, 0.0); - glMultiTexCoord2d(GL_TEXTURE2, 1.0, 0.0); - glVertex3d(innerXMin + x, innerYMin + y, zMax); - glEnd(); - - // right face - - - glBegin(mode); - temp = lightPos - Point3D(innerXMax + x, innerYMin + y, zMax); - temp.normalize(); - vertex_to_light_x = lightPos[0] - (innerXMax + x); - vertex_to_light_y = lightPos[1] - (innerYMin + y); - glMultiTexCoord3d(GL_TEXTURE0, temp[0], temp[1], temp[2]); - glMultiTexCoord2d(GL_TEXTURE1, 0.0, 0.0); - glMultiTexCoord2d(GL_TEXTURE2, 0.0, 0.0); - glVertex3d(innerXMax + x, innerYMin + y, zMin); - - temp = lightPos - Point3D(innerXMax + x, innerYMax + y, zMax); - temp.normalize(); - glMultiTexCoord3d(GL_TEXTURE0, temp[0], temp[1], temp[2]); - glMultiTexCoord2d(GL_TEXTURE1, 1.0, 0.0); - glMultiTexCoord2d(GL_TEXTURE2, 1.0, 0.0); - glVertex3d(innerXMax + x, innerYMax + y, zMin); - - glVertex3d(innerXMax + x, innerYMax + y, zMax); - - glVertex3d(innerXMax + x, innerYMin + y, zMax); - glEnd(); - - // Back of front face - - - glBegin(mode); - temp = lightPos - Point3D(innerXMin + x, innerYMin + y, zMax); - temp.normalize(); - vertex_to_light_x = lightPos[0] - (innerXMin + x); - vertex_to_light_y = lightPos[1] - (innerYMin + y); - glMultiTexCoord3d(GL_TEXTURE0, temp[0], temp[1], temp[2]); - glMultiTexCoord2d(GL_TEXTURE1, 0.0, 0.0); - glMultiTexCoord2d(GL_TEXTURE2, 0.0, 0.0); - glVertex3d(innerXMin + x, innerYMin + y, zMin); - - vertex_to_light_x = lightPos[0] - (innerXMax + x); - vertex_to_light_y = lightPos[1] - (innerYMin + y); - temp = lightPos - Point3D(innerXMax + x, innerYMin + y, zMax); - temp.normalize(); - glMultiTexCoord3d(GL_TEXTURE0, temp[0], temp[1], temp[2]); - glMultiTexCoord2d(GL_TEXTURE1, 1.0, 0.0); - glMultiTexCoord2d(GL_TEXTURE2, 1.0, 0.0); - glVertex3d(innerXMax + x, innerYMin + y, zMin); - - glVertex3d(innerXMax + x, innerYMax + y, zMin); - - glVertex3d(innerXMin + x, innerYMax + y, zMin); - glEnd(); -glDisable(GL_BLEND); -} - - void Viewer::startScale() { shiftIsDown = true; @@ -1125,10 +1156,10 @@ bool Viewer::on_key_press_event( GdkEventKey *ev ) if (gameOver) return true; - if (ev->keyval == GDK_Left || ev->keyval == GDK_Right) +/* if (ev->keyval == GDK_Left || ev->keyval == GDK_Right) sm.PlaySound(moveSound); else if (ev->keyval == GDK_Up || ev->keyval == GDK_Down) - sm.PlaySound(turnSound); + sm.PlaySound(turnSound);*/ if (ev->keyval == GDK_Left) @@ -1182,6 +1213,7 @@ bool Viewer::gameTick() { gameOver = true; tickTimer.disconnect(); + std::cerr << "Boo!"; } invalidate(); @@ -1241,93 +1273,25 @@ bool Viewer::moveClearBar() return true; } -void Viewer::draw_start_screen(bool pick) +void Viewer::drawStartScreen(bool pick, GLuint texId) { if (pick) glPushName(1); - -/* for (int i = HEIGHT + 3;i>=0;i--) // row - { - for (int j = WIDTH - 1; j>=0;j--) // column - */ -// glEnable(GL_POLYGON_SMOOTH); - drawCube (3, 0, 7, GL_LINE_LOOP ); - drawCube (4, 0, 7, GL_LINE_LOOP ); - drawCube (5, 0, 7, GL_LINE_LOOP ); - drawCube (6, 0, 7, GL_LINE_LOOP ); - drawCube (7, 0, 7, GL_LINE_LOOP ); - drawCube (7, 1, 7, GL_LINE_LOOP ); - drawCube (7, 2, 7, GL_LINE_LOOP ); - drawCube (5, 1, 7, GL_LINE_LOOP ); - drawCube (5, 2, 7, GL_LINE_LOOP ); - drawCube (6, 2, 7, GL_LINE_LOOP ); - - drawCube (3, 0, 3, GL_QUADS ); - drawCube (4, 0, 3, GL_QUADS ); - drawCube (5, 0, 3, GL_QUADS ); - drawCube (6, 0, 3, GL_QUADS ); - drawCube (7, 0, 3, GL_QUADS ); - drawCube (7, 1, 3, GL_QUADS ); - drawCube (7, 2, 3, GL_QUADS ); - drawCube (5, 1, 3, GL_QUADS ); - drawCube (5, 2, 3, GL_QUADS ); - drawCube (6, 2, 3, GL_QUADS ); - - - drawCube(3, 4, 7, GL_LINE_LOOP); - drawCube(4, 4, 7, GL_LINE_LOOP); - drawCube(5, 4, 7, GL_LINE_LOOP); - drawCube(6, 4, 7, GL_LINE_LOOP); - drawCube(7, 4, 7, GL_LINE_LOOP); - drawCube(3, 5, 7, GL_LINE_LOOP); - drawCube(3, 6, 7, GL_LINE_LOOP); - - drawCube(3, 4, 4, GL_QUADS); - drawCube(4, 4, 4, GL_QUADS); - drawCube(5, 4, 4, GL_QUADS); - drawCube(6, 4, 4, GL_QUADS); - drawCube(7, 4, 4, GL_QUADS); - drawCube(3, 5, 4, GL_QUADS); - drawCube(3, 6, 4, GL_QUADS); - - drawCube(3, 8, 7, GL_LINE_LOOP); - drawCube(4, 8, 7, GL_LINE_LOOP); - drawCube(5, 8, 7, GL_LINE_LOOP); - drawCube(6, 8, 7, GL_LINE_LOOP); - drawCube(7, 9, 7, GL_LINE_LOOP); - drawCube(4, 9, 7, GL_LINE_LOOP); - drawCube(3, 10, 7, GL_LINE_LOOP); - drawCube(4, 10, 7, GL_LINE_LOOP); - drawCube(5, 10, 7, GL_LINE_LOOP); - drawCube(6, 10, 7, GL_LINE_LOOP); - - drawCube(3, 8, 5, GL_QUADS); - drawCube(4, 8, 5, GL_QUADS); - drawCube(5, 8, 5, GL_QUADS); - drawCube(6, 8, 5, GL_QUADS); - drawCube(7, 9, 5, GL_QUADS); - drawCube(4, 9, 5, GL_QUADS); - drawCube(3, 10, 5,GL_QUADS); - drawCube(4, 10, 5,GL_QUADS); - drawCube(5, 10, 5,GL_QUADS); - drawCube(6, 10, 5,GL_QUADS); - - drawCube(3, 13, 7, GL_LINE_LOOP); - drawCube(4, 13, 7, GL_LINE_LOOP); - drawCube(5, 13, 7, GL_LINE_LOOP); - drawCube(6, 12, 7, GL_LINE_LOOP); - drawCube(7, 12, 7, GL_LINE_LOOP); - drawCube(6, 14, 7, GL_LINE_LOOP); - drawCube(7, 14, 7, GL_LINE_LOOP); - - drawCube(3, 13, 6, GL_QUADS); - drawCube(4, 13, 6, GL_QUADS); - drawCube(5, 13, 6, GL_QUADS); - drawCube(6, 12, 6, GL_QUADS); - drawCube(7, 12, 6, GL_QUADS); - drawCube(6, 14, 6, GL_QUADS); - drawCube(7, 14, 6, GL_QUADS); -// glDisable(GL_MULTISAMPLE_ARB); + + glEnable(GL_TEXTURE_2D); + glBindTexture(GL_TEXTURE_2D, texId); + glBegin(GL_QUADS); + glTexCoord2f(0.0f, 0.0f); + glVertex3d(5, 3, 1); + glTexCoord2f(1.0f, 0.0f); + glVertex3d(13, 3, 1); + glTexCoord2f(1.0f, 1.0f); + glVertex3d(13, 7, 1); + glTexCoord2f(0.0f, 1.0f); + glVertex3d(5, 7, 1); + glEnd(); + glBindTexture(GL_TEXTURE_2D, 0); + if (pick) glPopName(); @@ -1460,6 +1424,11 @@ void Viewer::toggleBumpMapping() transluceny = !transluceny; } +void Viewer::pauseGame() +{ + tickTimer.disconnect(); +} + int Viewer::GenNormalizationCubeMap(unsigned int size, GLuint &texid) { glGenTextures(1, &texid); diff --git a/viewer.hpp b/viewer.hpp index b7a067a..c325912 100644 --- a/viewer.hpp +++ b/viewer.hpp @@ -6,7 +6,8 @@ #include #include "game.hpp" #include "SoundManager.hpp" - +#include +#include // The "main" OpenGL widget class Viewer : public Gtk::GL::DrawingArea { public: @@ -55,8 +56,7 @@ class Viewer : public Gtk::GL::DrawingArea { void setScoreWidgets(Gtk::Label *score, Gtk::Label *linesCleared); bool moveClearBar(); - void draw_start_screen(bool picking); - + void pauseGame(); // Texture mapping stuff @@ -75,8 +75,6 @@ class Viewer : public Gtk::GL::DrawingArea { int ImageLoad(char *filename, Image *image); int LoadGLTextures(char *filename, GLuint &texid); - Point3D lightPos; - GLuint normalization_cube_map, bumpMap, floorTexId; int GenNormalizationCubeMap(unsigned int size, GLuint &texid); // Bump mapping stuff /* bool SetUpARB_multitexture() @@ -139,8 +137,16 @@ class Viewer : public Gtk::GL::DrawingArea { private: - - void drawCube(int y, int x, int colourId, GLenum mode, bool multiColour = false); + void drawScene(int iter); + void drawBar(); + void drawFallingBox(); + void drawFloor(); + void drawShadowVolumes(); + void drawShadowCube(float y, float x, GLenum mode); + void drawRoom(); + void drawStartScreen(bool picking, GLuint texId); + + void drawCube(float y, float x, int colourId, GLenum mode, bool multiColour = false); void drawBumpCube(int y, int x, int colourId, GLenum mode, bool multiColour = false); DrawMode currentDrawMode; @@ -210,8 +216,16 @@ class Viewer : public Gtk::GL::DrawingArea { int backgroundMusic; int turnSound; int moveSound; -// int backgroundSoundIndex; -// int backgroundSoundBuf; + GLuint square; + float shadowProj[16]; + float lightPos[4]; + + float planeNormal[4]; + bool drawingShadow; + GLuint normalization_cube_map, bumpMap, floorTexId, playButtonTex, playButtonClickedTex; + bool clickedButton; + std::vector< std::pair > silhouette; + }; #endif