From d4d35970d88edccdd963e53ea3e11f702e1e2bab Mon Sep 17 00:00:00 2001 From: Oliver Schinagl Date: Wed, 14 May 2008 11:56:06 +0000 Subject: fix this --- matchblox/AUTHORS | 0 matchblox/C_3DObject.cpp | 336 ++++++++++++++++++++++++++++++ matchblox/C_3DObject.h | 66 ++++++ matchblox/C_Block.cpp | 71 +++++++ matchblox/C_Block.h | 33 +++ matchblox/C_Box.cpp | 111 ++++++++++ matchblox/C_Box.h | 35 ++++ matchblox/C_Environment.cpp | 119 +++++++++++ matchblox/C_Environment.h | 32 +++ matchblox/C_Hand.cpp | 43 ++++ matchblox/C_Hand.h | 33 +++ matchblox/C_Log.cpp | 24 +++ matchblox/C_Log.h | 20 ++ matchblox/C_MatchBloxEngine.cpp | 348 ++++++++++++++++++++++++++++++++ matchblox/C_MatchBloxEngine.h | 87 ++++++++ matchblox/ChangeLog | 18 -- matchblox/Makefile | 43 ++++ matchblox/Makefile.am | 32 --- matchblox/NEWS | 0 matchblox/README | 0 matchblox/TODO.tasks | 6 - matchblox/autogen.sh | 159 --------------- matchblox/bitmap.cpp | 98 +++++++++ matchblox/bitmap.h | 24 +++ matchblox/common/bitmap.c | 114 +++++++++++ matchblox/common/bitmap.h | 24 +++ matchblox/common/font.c | 90 +++++++++ matchblox/common/font.h | 30 +++ matchblox/common/message_queue.c | 101 ++++++++++ matchblox/common/message_queue.h | 37 ++++ matchblox/configure.ac | 29 --- matchblox/engine/C_3DObject.cpp | 336 ++++++++++++++++++++++++++++++ matchblox/engine/C_3DObject.h | 66 ++++++ matchblox/engine/C_Block.cpp | 71 +++++++ matchblox/engine/C_Block.h | 33 +++ matchblox/engine/C_Box.cpp | 111 ++++++++++ matchblox/engine/C_Box.h | 35 ++++ matchblox/engine/C_Environment.cpp | 119 +++++++++++ matchblox/engine/C_Environment.h | 32 +++ matchblox/engine/C_Hand.cpp | 43 ++++ matchblox/engine/C_Hand.h | 33 +++ matchblox/engine/C_Log.cpp | 24 +++ matchblox/engine/C_Log.h | 20 ++ matchblox/engine/C_MatchBloxEngine.cpp | 348 ++++++++++++++++++++++++++++++++ matchblox/engine/C_MatchBloxEngine.h | 87 ++++++++ matchblox/engine/MessageQueue.h | 26 +++ matchblox/engine/typedefs.h | 128 ++++++++++++ matchblox/main.cpp | 158 +++++++++++++++ matchblox/matchblox.anjuta | 44 ---- matchblox/matchblox.vcproj | 277 +++++++++++++++++++++++++ matchblox/menu/button.c | 328 ++++++++++++++++++++++++++++++ matchblox/menu/button.h | 54 +++++ matchblox/menu/menu.c | 359 +++++++++++++++++++++++++++++++++ matchblox/menu/menu.h | 10 + matchblox/src/Makefile | 299 --------------------------- matchblox/src/Makefile.am | 13 -- matchblox/src/Makefile.in | 299 --------------------------- matchblox/src/main.c | 32 --- matchblox/src/renderer_opengl.c | 307 ---------------------------- matchblox/src/renderer_opengl.h | 25 --- matchblox/typedefs.h | 128 ++++++++++++ 61 files changed, 4745 insertions(+), 1263 deletions(-) delete mode 100644 matchblox/AUTHORS create mode 100644 matchblox/C_3DObject.cpp create mode 100644 matchblox/C_3DObject.h create mode 100644 matchblox/C_Block.cpp create mode 100644 matchblox/C_Block.h create mode 100644 matchblox/C_Box.cpp create mode 100644 matchblox/C_Box.h create mode 100644 matchblox/C_Environment.cpp create mode 100644 matchblox/C_Environment.h create mode 100644 matchblox/C_Hand.cpp create mode 100644 matchblox/C_Hand.h create mode 100644 matchblox/C_Log.cpp create mode 100644 matchblox/C_Log.h create mode 100644 matchblox/C_MatchBloxEngine.cpp create mode 100644 matchblox/C_MatchBloxEngine.h delete mode 100644 matchblox/ChangeLog create mode 100644 matchblox/Makefile delete mode 100644 matchblox/Makefile.am delete mode 100644 matchblox/NEWS delete mode 100644 matchblox/README delete mode 100644 matchblox/TODO.tasks delete mode 100755 matchblox/autogen.sh create mode 100644 matchblox/bitmap.cpp create mode 100644 matchblox/bitmap.h create mode 100644 matchblox/common/bitmap.c create mode 100644 matchblox/common/bitmap.h create mode 100644 matchblox/common/font.c create mode 100644 matchblox/common/font.h create mode 100644 matchblox/common/message_queue.c create mode 100644 matchblox/common/message_queue.h delete mode 100644 matchblox/configure.ac create mode 100644 matchblox/engine/C_3DObject.cpp create mode 100644 matchblox/engine/C_3DObject.h create mode 100644 matchblox/engine/C_Block.cpp create mode 100644 matchblox/engine/C_Block.h create mode 100644 matchblox/engine/C_Box.cpp create mode 100644 matchblox/engine/C_Box.h create mode 100644 matchblox/engine/C_Environment.cpp create mode 100644 matchblox/engine/C_Environment.h create mode 100644 matchblox/engine/C_Hand.cpp create mode 100644 matchblox/engine/C_Hand.h create mode 100644 matchblox/engine/C_Log.cpp create mode 100644 matchblox/engine/C_Log.h create mode 100644 matchblox/engine/C_MatchBloxEngine.cpp create mode 100644 matchblox/engine/C_MatchBloxEngine.h create mode 100644 matchblox/engine/MessageQueue.h create mode 100644 matchblox/engine/typedefs.h create mode 100644 matchblox/main.cpp delete mode 100644 matchblox/matchblox.anjuta create mode 100644 matchblox/matchblox.vcproj create mode 100644 matchblox/menu/button.c create mode 100644 matchblox/menu/button.h create mode 100644 matchblox/menu/menu.c create mode 100644 matchblox/menu/menu.h delete mode 100644 matchblox/src/Makefile delete mode 100644 matchblox/src/Makefile.am delete mode 100644 matchblox/src/Makefile.in delete mode 100644 matchblox/src/main.c delete mode 100644 matchblox/src/renderer_opengl.c delete mode 100644 matchblox/src/renderer_opengl.h create mode 100644 matchblox/typedefs.h diff --git a/matchblox/AUTHORS b/matchblox/AUTHORS deleted file mode 100644 index e69de29..0000000 diff --git a/matchblox/C_3DObject.cpp b/matchblox/C_3DObject.cpp new file mode 100644 index 0000000..3cb00b1 --- /dev/null +++ b/matchblox/C_3DObject.cpp @@ -0,0 +1,336 @@ +#include +#include +#include +#include +#include + +#include "typedefs.h" +#include "C_3DObject.h" + +#include "bitmap.h" + +C_3DObject::C_3DObject() + : m_Pos(0.0, 0.0, 0.0), m_Rot(0.0, 0.0, 0.0), + m_Scale(1.0, 1.0, 1.0), + m_bOwnTexture(false), + m_bDispListValid(false) +{ + std::cout << "C_3DObject:: default constructor\n"; +} + + +C_3DObject::C_3DObject(const char* f_strFileName, + char* f_strColorTexName, + MatProps_t f_Material) + : m_Pos(0.0, 0.0, 0.0), m_Rot(0.0, 0.0, 0.0), + m_Scale(1.0, 1.0, 1.0), + m_bOwnTexture(false), + m_bDispListValid(false), + m_Mat(f_Material) +{ + BitmapStruct l_bmp; + + //load 3d model + m_bDispListValid = CreateObject(f_strFileName); + + //load textures + if (m_bDispListValid) + { + if (f_strColorTexName != NULL) + { + std::cout << "Loading " << f_strColorTexName << std::endl; + l_bmp = BitmapLoad(f_strColorTexName); + m_uiColorTex = (GLuint)l_bmp.m_iImageId; + m_bOwnTexture = true; + } + } +} + +C_3DObject::C_3DObject(const char* f_strFileName, + GLuint f_uiTexture, + MatProps_t f_Material) + : m_Pos(0.0, 0.0, 0.0), m_Rot(0.0, 0.0, 0.0), + m_Scale(1.0, 1.0, 1.0), + m_bOwnTexture(false), + m_bDispListValid(false), + m_uiColorTex(f_uiTexture), + m_Mat(f_Material) +{ + //load 3d model + m_bDispListValid = CreateObject(f_strFileName); + +} + +C_3DObject::~C_3DObject() +{ + if (glIsList(m_uiListIndex)) + glDeleteLists(m_uiListIndex, 1); + + if (glIsTexture(m_uiColorTex) && m_bOwnTexture) + glDeleteTextures(1, &m_uiColorTex); +} + +void C_3DObject::TransRotateScale() +{ + glScaled(m_Scale.x, m_Scale.y, m_Scale.z); + glTranslated(m_Pos.x, m_Pos.y, m_Pos.z); + glRotated(m_Rot.z, 0.0, 0.0, 1.0); + glRotated(m_Rot.x, 1.0, 0.0, 0.0); + glRotated(m_Rot.y, 0.0, 1.0, 0.0); +} + +void C_3DObject::Render() +{ + //apply OpenGL settings for rendering this Object + glPushAttrib(GL_TEXTURE_BIT); + glEnable(GL_TEXTURE_2D); + //modulate the texture color with the computed material + //colors + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); + glBindTexture(GL_TEXTURE_2D, m_uiColorTex); + + //set material properties + glMaterialfv(GL_FRONT, GL_AMBIENT, m_Mat.m_fAmb); + glMaterialfv(GL_FRONT, GL_DIFFUSE, m_Mat.m_fDif); + glMaterialfv(GL_FRONT, GL_SPECULAR, m_Mat.m_fSpec); + glMaterialfv(GL_FRONT, GL_EMISSION, m_Mat.m_fEmi); + glMaterialf(GL_FRONT, GL_SHININESS, m_Mat.m_fShin); + +/* + //scale translate and rotate + glPushMatrix(); + + glScaled(m_Scale.x, m_Scale.y, m_Scale.z); + glTranslated(m_Pos.x, m_Pos.y, m_Pos.z); + glRotated(m_Rot.z, 0.0, 0.0, 1.0); + glRotated(m_Rot.x, 1.0, 0.0, 0.0); + glRotated(m_Rot.y, 0.0, 1.0, 0.0); +*/ + + //render by calling the display list + if(m_bDispListValid) + { + glCallList(m_uiListIndex); + } + else + { + //or render a LARGE cube when we failed to load the + //geometry + glutSolidCube(10.0); + } + +// glPopMatrix(); + + glPopAttrib(); +} + + + +bool C_3DObject::CreateObject(const char *f_pFilePath) +{ + Geometry_t l_Geom; + bool l_bParseOk; + Vect3D_t l_DummyVect; + + //the triangle indices are 1-based so we insert dummy Vect3D_t + //to fill the 0 positions in the vertex, normals and texcoords + //vector containers. + l_Geom.m_verts.push_back(l_DummyVect); + l_Geom.m_norms.push_back(l_DummyVect); + l_Geom.m_texs.push_back(l_DummyVect); + + l_bParseOk = LoadGeometryData(f_pFilePath, l_Geom); + + //output statistics + std::cout << "C_3DObject: file " << f_pFilePath + << "\nParse: " << (l_bParseOk? "SUCCESS" : "FAILURE") + << "\nVertices: " << l_Geom.m_verts.size()-1 + << "\nNormals: " << l_Geom.m_norms.size()-1 + << "\nTexCrds: " << l_Geom.m_texs.size()-1 + << "\nTriangles: " << l_Geom.m_triangles.size() + << "\nBoundBox: x(" << m_BBox.m_dLeft << "," << m_BBox.m_dRight << ")" + << "\n y(" << m_BBox.m_dBottom << "," << m_BBox.m_dTop << ")" + << "\n z(" << m_BBox.m_dFront << "," << m_BBox.m_dBack << ")" + << std::endl; + + if(!l_bParseOk) + { + std::cout << "C_3DObject Error: failed to parse file " + << f_pFilePath << std::endl; + + return false; + } + + //create display list + m_uiListIndex = glGenLists(1); + glNewList(m_uiListIndex, GL_COMPILE); + + glBegin(GL_TRIANGLES); + + //iterate through the triangles + std::vector::iterator it = l_Geom.m_triangles.begin(); + for(; it != l_Geom.m_triangles.end(); it++) + { + //vertex1 + Vect3D_t v = l_Geom.m_verts[it->v1], + t = l_Geom.m_texs[it->t1], + n = l_Geom.m_norms[it->n1]; + + glNormal3d(n.x, n.y, n.z); + glTexCoord3d(t.x, t.y, t.z); + glVertex3d(v.x, v.y, v.z); + + //vertex2 + v = l_Geom.m_verts[it->v2], + t = l_Geom.m_texs[it->t2], + n = l_Geom.m_norms[it->n2]; + + glNormal3d(n.x, n.y, n.z); + glTexCoord3d(t.x, t.y, t.z); + glVertex3d(v.x, v.y, v.z); + + //vertex3 + v = l_Geom.m_verts[it->v3], + t = l_Geom.m_texs[it->t3], + n = l_Geom.m_norms[it->n3]; + + glNormal3d(n.x, n.y, n.z); + glTexCoord3d(t.x, t.y, t.z); + glVertex3d(v.x, v.y, v.z);} + + glEnd(); + + glEndList(); + + return true; +} + +bool C_3DObject::LoadGeometryData(const char *f_pFilePath, Geometry_t &f_Geom) +{ + std::ifstream l_infile(f_pFilePath); + char l_inbuffer[256]; + bool l_bParseOk = true; + Vect3D_t l_v3; + Triangle_t l_tri; + + if (l_infile.fail()) + { + std::cout << "C_3DObject Error: could not open file " + << f_pFilePath << std::endl; + + return false; + } + + + //load data + while(!l_infile.eof() && l_bParseOk) + { + //read the next line + l_infile.getline(l_inbuffer, 256); + + //check if reading succeeded + if (l_infile.eof() || l_infile.fail() || l_infile.bad()) + { + break; + } + + //try to parse the first string of the line as one of the keywords: + //v -> vertex coordinate + //vt -> texture coordinate + //vn -> vertex normal + //f -> face record + switch (l_inbuffer[0]) + { + case 'v' : + //posibilities 'v' 'vt' 'vn' + switch (l_inbuffer[1]) + { + case ' ': + //vertex + if (l_bParseOk = ParseVect3D(&l_inbuffer[2], l_v3)) + { + f_Geom.m_verts.push_back(l_v3); + //update boundingbox + UpdBBox(m_BBox, l_v3); + } + break; + + case 't': + if (l_inbuffer[2] == ' ') + { + //texture coordinates + if (l_bParseOk = ParseVect3D(&l_inbuffer[3], l_v3)) + { + f_Geom.m_texs.push_back(l_v3); + } + } + break; + + case 'n': + if (l_inbuffer[2] == ' ') + { + //normal + if (l_bParseOk = ParseVect3D(&l_inbuffer[3], l_v3)) + { + f_Geom.m_norms.push_back(l_v3); + } + } + break; + } + break; + + case 'f': + if (l_inbuffer[1] == ' ') + { + //face (triangle) + if (l_bParseOk = ParseTriangle(&l_inbuffer[2], l_tri)) + { + f_Geom.m_triangles.push_back(l_tri); + } + } + break; + + case 'm' : // 'mtllib'? + break; + + case 'u' : // 'usemtl' ? + break; + } + } + + l_infile.close(); + + if (!l_bParseOk) + { + std::cout << "Parse error in: \"" << l_inbuffer << "\"\n"; + } + + return l_bParseOk; +} + +bool C_3DObject::ParseVect3D(const char *f_pInBuffer, Vect3D_t &f_V3) +{ + //format: " x y z " + std::stringstream l_inbuffer(f_pInBuffer); + + l_inbuffer >> std::skipws >> f_V3.x >> f_V3.y >> f_V3.z; + + //std::cout << "Read values: " << f_V3.x << ", " << f_V3.y << ", " << f_V3.z << "\n"; + + return !l_inbuffer.fail(); +} + +bool C_3DObject::ParseTriangle(const char *f_pInBuffer, Triangle_t &f_triangle) +{ + //format v1/vt1/vn1 v2/vt2/vn2 v3/vt3/vn3 + std::stringstream l_inbuffer(f_pInBuffer); + + char l_slash; + + l_inbuffer >> std::skipws >> f_triangle.v1 >> l_slash >> f_triangle.t1 >> l_slash >> f_triangle.n1; + l_inbuffer >> std::skipws >> f_triangle.v2 >> l_slash >> f_triangle.t2 >> l_slash >> f_triangle.n2; + l_inbuffer >> std::skipws >> f_triangle.v3 >> l_slash >> f_triangle.t3 >> l_slash >> f_triangle.n3; + + return !l_inbuffer.fail(); +} + diff --git a/matchblox/C_3DObject.h b/matchblox/C_3DObject.h new file mode 100644 index 0000000..4027596 --- /dev/null +++ b/matchblox/C_3DObject.h @@ -0,0 +1,66 @@ +#ifndef C_3DOBJECT_HEADER_FILE + +#define C_3DOBJECT_HEADER_FILE + +#include +#include + +#include "typedefs.h" + +class C_3DObject +{ +public: + C_3DObject(); + C_3DObject(const char* f_strFileName, + char* f_strColorTexName, + MatProps_t f_Material); + C_3DObject(const char* f_strFileName, + GLuint f_uiTexturei, + MatProps_t f_Material); + + ~C_3DObject(); + + inline void SetPos(double f_dX, double f_dY, double f_dZ) + { m_Pos.x = f_dX; m_Pos.y = f_dY; m_Pos.z = f_dZ; } + inline void SetRot(double f_dX, double f_dY, double f_dZ) + { m_Rot.x = f_dX; m_Rot.y = f_dY; m_Rot.z = f_dZ; } + inline void SetScale(double f_dX, double f_dY, double f_dZ) + { m_Scale.x = f_dX; m_Scale.y = f_dY; m_Scale.z = f_dZ; } + inline void SetPos(const Vect3D_t &pos) + { m_Pos = pos; } + inline void SetRot(const Vect3D_t &rot) + { m_Rot = rot; } + inline void SetScale(const Vect3D_t &scale) + { m_Scale = scale; } + + inline const Vect3D_t& GetPos() { return m_Pos; } + inline const Vect3D_t& GetRot() { return m_Rot; } + inline const Vect3D_t& GetScale() { return m_Scale; } + inline const BoundingBox_t& GetBoundingBox() { return m_BBox; } + inline bool Initialized() { return m_bDispListValid; } + + void TransRotateScale(); //applies the scaling, translation and rotation + //for this object + virtual void Render(); //renders the object using the current projection + //and modelview matrices + +protected: + Vect3D_t m_Pos, + m_Rot, + m_Scale; + + BoundingBox_t m_BBox; //bounding box of the object + GLuint m_uiListIndex; //display list index + bool m_bDispListValid; + GLuint m_uiColorTex; + bool m_bOwnTexture; + MatProps_t m_Mat; + + bool CreateObject(const char *f_pFilePath); + bool LoadGeometryData(const char *f_pFilePath, Geometry_t &f_Geom); + bool ParseVect3D(const char *f_pInbuffer, Vect3D_t &f_V3); + bool ParseTriangle(const char *f_pInbuffer, Triangle_t &f_triangle); +}; + +#endif //C_3DOBJECT_HEADER_FILE + diff --git a/matchblox/C_Block.cpp b/matchblox/C_Block.cpp new file mode 100644 index 0000000..4c092a2 --- /dev/null +++ b/matchblox/C_Block.cpp @@ -0,0 +1,71 @@ +#include + +#include + +#include "C_Block.h" + +#define FADE_DURATION 500 + +/*Durations of animations*/ +unsigned int g_BlockAnimDurations[4] = {0, 500, 500, 500}; + +C_Block::C_Block(const char* f_strFileName, + GLuint f_uiColorTex , + MatProps_t f_Mat) +: C_3DObject(f_strFileName, f_uiColorTex, f_Mat), + m_CurrState(BS_IDLE), m_uiAnimStart(0) +{ + +} + +C_Block::~C_Block() +{ + +} + +void C_Block::Render(unsigned int f_iElapsedTime) +{ + unsigned int l_uiDeltaTime = f_iElapsedTime - m_uiAnimStart; + double l_Scale = 0.0; + + + //check if the previous animation has ended in between + //calls to this Render function. + if (l_uiDeltaTime > g_BlockAnimDurations[(int)m_CurrState]) + { + m_CurrState = BS_IDLE; + } + + glPushMatrix(); + + switch (m_CurrState) + { + case BS_FADE_IN: + l_Scale = (double)l_uiDeltaTime / (double)g_BlockAnimDurations[BS_FADE_IN]; + //glScaled(l_Scale, l_Scale, l_Scale); + SetScale(l_Scale, l_Scale, l_Scale); + TransRotateScale(); + C_3DObject::Render(); + break; + + case BS_FADE_OUT: + l_Scale = 1.0 - ((double)l_uiDeltaTime / (double)g_BlockAnimDurations[BS_FADE_OUT]); +// glScaled(l_Scale, l_Scale, l_Scale); + SetScale(l_Scale, l_Scale, l_Scale); + TransRotateScale(); + C_3DObject::Render(); + break; + + case BS_COLLIDE: + break; + + case BS_IDLE: + default: + TransRotateScale(); + C_3DObject::Render(); + break; + } + + glPopMatrix(); + +} diff --git a/matchblox/C_Block.h b/matchblox/C_Block.h new file mode 100644 index 0000000..f0e03b7 --- /dev/null +++ b/matchblox/C_Block.h @@ -0,0 +1,33 @@ +#ifndef C_BLOCK_HEADER_FILE + +#define C_BLOCK_HEADER_FILE + +#include "C_3DObject.h" + +typedef enum BlockAnimState +{ + BS_IDLE = 0, + BS_FADE_IN = 1, + BS_FADE_OUT = 2, + BS_COLLIDE = 3 +}; + + +class C_Block : public C_3DObject +{ +public: + C_Block(const char* f_strFileName, + GLuint f_uiColorTex , + MatProps_t f_Mat); + ~C_Block(); + + void Render(unsigned int f_iElapsedTime); + inline void SetState(BlockAnimState f_State, unsigned int f_uiElapsedTime) { m_CurrState = f_State; m_uiAnimStart = f_uiElapsedTime; } + +private: + BlockAnimState m_CurrState; + unsigned int m_uiAnimStart; +}; + +#endif //C_BLOCK_HEADER_FILE + diff --git a/matchblox/C_Box.cpp b/matchblox/C_Box.cpp new file mode 100644 index 0000000..9bde3ff --- /dev/null +++ b/matchblox/C_Box.cpp @@ -0,0 +1,111 @@ +#include +#include + +#include "C_Box.h" +#include "typedefs.h" + +C_Box::C_Box(const char *f_strFileName, + GLuint f_uiTexture, + MatProps_t f_Mat, + int f_iTilesX, int f_iTilesY, + C_3DObject *f_pTiles[5]) +: C_3DObject(f_strFileName, f_uiTexture, f_Mat), + m_pTiles(f_pTiles), m_iTilesX(f_iTilesX), + m_iTilesY(f_iTilesY) +{ + m_iNumTiles = m_iTilesX * m_iTilesY; + //create a new tiles layout array + m_iTilesLayout = new int[m_iNumTiles]; + + //calculate the tile size (this should be the same + //for all tile types) + BoundingBox_t l_BBox = m_pTiles[0]->GetBoundingBox(); + m_dTileSize = l_BBox.m_dRight - l_BBox.m_dLeft; + + //calculate the lower left tile position (in xz plane) + m_LowLeftTilePos = Vect3D_t(-m_dTileSize * (double)(m_iTilesX-1)/2.0, + 0.0, + m_dTileSize * (double)(m_iTilesY-1)/2.0); +} + +C_Box::~C_Box() +{ + delete [] m_iTilesLayout; +} + +void C_Box::RandomizeTiles() +{ + int l_iNumTiles = m_iTilesX * m_iTilesY; + + //first set the layout to all tiles with no hole + for (int i=0; iSetPos(m_LowLeftTilePos.x + (double)col * m_dTileSize, + 0.0, + m_LowLeftTilePos.z - (double)row * m_dTileSize); + } +} + +void C_Box::Render() +{ + // + glPushMatrix(); + + //apply transformation for box + TransRotateScale(); + + //render the box + C_3DObject::Render(); + + + //render the tiles + for(int x=0; x= 0 && l_iTileIndex <= 3) + { + //tile with a hole + glPushMatrix(); + m_pTiles[l_iTileIndex]->TransRotateScale(); + m_pTiles[l_iTileIndex]->Render(); + glPopMatrix(); + } + else + { + //tile without a hole + //set the position + m_pTiles[4]->SetPos(m_LowLeftTilePos.x + (double)x * m_dTileSize, + 0.0, + m_LowLeftTilePos.z - (double)y * m_dTileSize); + glPushMatrix(); + m_pTiles[4]->TransRotateScale(); + m_pTiles[4]->Render(); + glPopMatrix(); + } + } + + glPopMatrix(); +} + diff --git a/matchblox/C_Box.h b/matchblox/C_Box.h new file mode 100644 index 0000000..ed8c133 --- /dev/null +++ b/matchblox/C_Box.h @@ -0,0 +1,35 @@ +#ifndef C_BOX_HEADER_FILE + +#define C_BOX_HEADER_FILE + +#include +#include "C_3DObject.h" + +class C_Box : public C_3DObject +{ +public: + C_Box(const char *f_strFileName, + GLuint f_uiTexture, + MatProps_t f_Mat, + int f_iTilesX, int f_iTilesY, + C_3DObject *f_pTiles[5]); + + ~C_Box(); + + void RandomizeTiles(); + void Render(); + +private: + C_3DObject **m_pTiles; //the tile objects for the top face of the box (holes) + int m_iTilesX, //number of tiles in x direction + m_iTilesY, //number of tiles in y direction + m_iNumTiles; //total number of tiles + double m_dTileSize; //the width and height of a tile + Vect3D_t m_LowLeftTilePos; //center position of the lower leftmost + //tile (relative to the box its position) + + int *m_iTilesLayout; //the indices of the tile objects +}; + +#endif //C_BOX_HEADER_FILE + diff --git a/matchblox/C_Environment.cpp b/matchblox/C_Environment.cpp new file mode 100644 index 0000000..0c7cbfd --- /dev/null +++ b/matchblox/C_Environment.cpp @@ -0,0 +1,119 @@ +#include +#include +#include + +#include "bitmap.h" +#include "C_Environment.h" + +#ifndef GL_CLAMP_TO_EDGE +#define GL_CLAMP_TO_EDGE 0x812F +#endif //GL_CLAMP_TO_EDGE + +using namespace std; + +C_Environment::C_Environment(const char *f_strEnvMapBaseName, + double f_dDistance) + : m_dDist(f_dDistance) +{ + string l_strBase = f_strEnvMapBaseName, + l_strFilename; + const char *l_suffix[] = { "negative_x.bmp", + "negative_y.bmp", + "negative_z.bmp", + "positive_x.bmp", + "positive_y.bmp", + "positive_z.bmp" + }; + + BitmapStruct l_bmp; + + //load textures + for (int i=0; i<6; i++) + { + l_strFilename = l_strBase + l_suffix[i]; + l_bmp = BitmapLoad((char*)l_strFilename.c_str()); + m_uiFaceTex[i] = (GLuint)l_bmp.m_iImageId; + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + + } +} + +C_Environment::~C_Environment() +{ + glDeleteTextures(6, m_uiFaceTex); +} + +void C_Environment::Render() +{ + double l_Vertices[8][3] = + { { -m_dDist, -m_dDist, m_dDist }, + { m_dDist, -m_dDist, m_dDist }, + { m_dDist, -m_dDist, -m_dDist }, + { -m_dDist, -m_dDist, -m_dDist }, + { -m_dDist, m_dDist, m_dDist }, + { m_dDist, m_dDist, m_dDist }, + { m_dDist, m_dDist, -m_dDist }, + { -m_dDist, m_dDist, -m_dDist } }; + + + //init render settings for rendering of the environment + //mapped cube + + glPushAttrib(GL_TEXTURE_BIT | GL_ENABLE_BIT); + + //no lighting + glDisable(GL_LIGHTING); + //enable texturing + glEnable(GL_TEXTURE_2D); + glTexEnvf(GL_TEXTURE_2D, GL_TEXTURE_ENV_MODE, GL_REPLACE); + //neg x (left) + glBindTexture(GL_TEXTURE_2D, m_uiFaceTex[0]); + RenderFace(l_Vertices, 3, 0, 4, 7); + + //neg y (down) + glBindTexture(GL_TEXTURE_2D, m_uiFaceTex[1]); + RenderFace(l_Vertices, 3, 2, 1, 0); + + //nez z (front) + glBindTexture(GL_TEXTURE_2D, m_uiFaceTex[2]); + RenderFace(l_Vertices, 2, 3, 7, 6); + + //pos x (right) + glBindTexture(GL_TEXTURE_2D, m_uiFaceTex[3]); + RenderFace(l_Vertices, 1, 2, 6, 5); + + //pos y (top) + glBindTexture(GL_TEXTURE_2D, m_uiFaceTex[4]); + RenderFace(l_Vertices, 4, 5, 6, 7); + + //pos z (back) + glBindTexture(GL_TEXTURE_2D, m_uiFaceTex[5]); + RenderFace(l_Vertices, 0, 1, 5, 4); + + glPopAttrib(); +} + +void C_Environment::RenderFace(double f_verts[8][3], + int f_v00, int f_v10, + int f_v11, int f_v01) +{ + //render textured quad in counter clockwise order + glBegin(GL_QUADS); + glTexCoord2i(0,0); + glVertex3dv(f_verts[f_v00]); + + glTexCoord2i(1,0); + glVertex3dv(f_verts[f_v10]); + + glTexCoord2i(1,1); + glVertex3dv(f_verts[f_v11]); + + glTexCoord2i(0,1); + glVertex3dv(f_verts[f_v01]); + glEnd(); + +} diff --git a/matchblox/C_Environment.h b/matchblox/C_Environment.h new file mode 100644 index 0000000..cfdb816 --- /dev/null +++ b/matchblox/C_Environment.h @@ -0,0 +1,32 @@ +#ifndef C_ENVIRONMENT_H + +#define C_ENVIRONMENT_H + +#include + +class C_Environment +{ +public: + //environment map consist of 6 bitmaps with a common + //base name with the axis name (_positive_x.bmp, + //_negative_y.bmp, ...) + //appended, the distance is the distance from the center + //to the sides of the cube + C_Environment(const char *f_strEnvMapBaseName, + double f_dDistance); + ~C_Environment(); + + void Render(); + void RenderFace(double f_verts[8][3], + int f_v00, int f_v10, + int f_v11, int f_v01); + +private: + double m_dDist; + + //texture handles for the faces of the cube + GLuint m_uiFaceTex[6]; //order -x, -y, -z, +x, +y, +z +}; + +#endif //C_ENVIRONMENT_H + diff --git a/matchblox/C_Hand.cpp b/matchblox/C_Hand.cpp new file mode 100644 index 0000000..8c4d977 --- /dev/null +++ b/matchblox/C_Hand.cpp @@ -0,0 +1,43 @@ +#include +#include "C_Hand.h" + +#define FADE_DURATION 500 + +//duration of animations in ms +unsigned int g_HandAnimDurations[3] = {0, 100, 100}; + + +C_Hand::C_Hand(const char* f_strFileName, GLuint f_uiTex, + MatProps_t f_Mat) +: C_3DObject(f_strFileName, f_uiTex, f_Mat), + m_CurrState(HS_IDLE), m_uiAnimStart(0) +{ +} + + +void C_Hand::Render(unsigned int f_iElapsedTime) +{ + unsigned int l_uiDeltaTime = f_iElapsedTime - m_uiAnimStart; + + if (l_uiDeltaTime > g_HandAnimDurations[(int)m_CurrState]) + { + m_CurrState = HS_IDLE; + } + + switch (m_CurrState) + { + case HS_GRAB: + C_3DObject::Render(); + break; + + case HS_RELEASE: + C_3DObject::Render(); + break; + + case HS_IDLE: + default: + C_3DObject::Render(); + break; + } + +} diff --git a/matchblox/C_Hand.h b/matchblox/C_Hand.h new file mode 100644 index 0000000..3ada63d --- /dev/null +++ b/matchblox/C_Hand.h @@ -0,0 +1,33 @@ +#ifndef C_HAND_HEADER_FILE + +#define C_HAND_HEADER_FILE + +#include "C_3DObject.h" +#include "typedefs.h" + +typedef enum HandAnimState +{ + HS_IDLE = 0, + HS_GRAB = 1, + HS_RELEASE = 2, + HS_COLLIDE = 3 +}; + + +class C_Hand : public C_3DObject +{ +public: + C_Hand(const char* f_strFileName, GLuint f_uiTex, + MatProps_t f_Mat); + ~C_Hand(); + + void Render(unsigned int f_iElapsedTime); + inline void SetState(HandAnimState f_State, unsigned int f_uiElapsedTime) { m_CurrState = f_State; m_uiAnimStart = f_uiElapsedTime; } + +private: + HandAnimState m_CurrState; + unsigned int m_uiAnimStart; +}; + +#endif //C_HAND_HEADER_FILE + diff --git a/matchblox/C_Log.cpp b/matchblox/C_Log.cpp new file mode 100644 index 0000000..d9a1154 --- /dev/null +++ b/matchblox/C_Log.cpp @@ -0,0 +1,24 @@ +#include "C_Log.h" + +C_Log::C_Log(char *f_strFileName) +{ +} + +C_Log::~C_Log() +{ +} + +bool C_Log::LogNewSession(int f_iUserID, int f_iGameID) +{ + return true; +} + +bool C_Log::LogSessionTurn(int f_iUserID, int f_iGameID, int f_iBlockNr, int HolePos, unsigned int f_uiTime) +{ + return true; +} + +bool C_Log::LogSessionTotals(int f_iUserID, int f_iGameID, unsigned int f_uiTotalTime) +{ + return true; +} diff --git a/matchblox/C_Log.h b/matchblox/C_Log.h new file mode 100644 index 0000000..2b598dd --- /dev/null +++ b/matchblox/C_Log.h @@ -0,0 +1,20 @@ +#ifndef C_LOG_HEADER_FILE + +#define C_LOG_HEADER_FILE + +class C_Log +{ +public: + C_Log(char *f_strFileName); + ~C_Log(); + + bool LogNewSession(int f_iUserID, int f_iGameID); + bool LogSessionTurn(int f_iUserID, int f_iGameID, int f_iBlockNr, int HolePos, unsigned int f_uiTime); + bool LogSessionTotals(int f_iUserID, int f_iGameID, unsigned int f_uiTotalTime); + +private: +// FILE *m_pLogFile; +}; + +#endif //C_LOG_HEADER_FILE + diff --git a/matchblox/C_MatchBloxEngine.cpp b/matchblox/C_MatchBloxEngine.cpp new file mode 100644 index 0000000..7e17b1b --- /dev/null +++ b/matchblox/C_MatchBloxEngine.cpp @@ -0,0 +1,348 @@ +#include + +#include +#include +#include + +#include "C_MatchBloxEngine.h" + +#include "C_3DObject.h" +#include "C_Environment.h" +#include "C_Hand.h" +#include "C_Block.h" +#include "C_Box.h" +#include "C_Log.h" +#include "bitmap.h" + +C_MatchBloxEngine::C_MatchBloxEngine(const char *f_strModelPath, + const char *f_strLogFile) +{ + //create logger + + + //Load models + if (LoadModels(f_strModelPath)) + { + //set state to initialised; + m_State = ES_INITIALISED; + } + else + { + m_State = ES_ERROR; + } + + //initialise a random seed + srand ( time(NULL) ); + + //init vars + m_CurrentBox = BS_SMALL; + + //debug + m_pBox[0]->SetPos(0.0, -5.0, -15.0); + m_pBox[0]->SetRot(45.0, 0.0, 0.0); + m_pBox[0]->RandomizeTiles(); + + m_pBlock[0]->SetPos(-6.0, 1.0, -10.0); + m_pBlock[0]->SetRot(90.0, 0.0, 0.0); + m_pBlock[1]->SetPos(-2.0, 1.0, -10.0); + m_pBlock[1]->SetRot(90.0, 0.0, 0.0); + m_pBlock[2]->SetPos(2.0, 1.0, -10.0); + m_pBlock[2]->SetRot(90.0, 0.0, 0.0); + m_pBlock[3]->SetPos(6.0, 1.0, -10.0); + m_pBlock[3]->SetRot(90.0, 0.0, 0.0); +} + +C_MatchBloxEngine::~C_MatchBloxEngine() +{ + //destroy logger + + //delete models + DeleteModels(); +} + +GameResult C_MatchBloxEngine::GameStep(msgQueue &f_Queue) +{ + //process message queue + return GR_ERROR; +} + +void C_MatchBloxEngine::Render_Basics(unsigned int f_uiElapsedTime) +{ + //render the environment + m_pEnvMap->Render(); + + m_pBox[(intptr_t)m_CurrentBox]->Render(); + for (int i=0; i<4; i++) + m_pBlock[i]->Render(f_uiElapsedTime); +// m_pHand->Render(f_uiElapsedTime); +} + +void C_MatchBloxEngine::Render(unsigned int f_uiElapsedTime) +{ + switch (m_State) + { + case ES_INITIALISED: + Render_Basics(f_uiElapsedTime); + break; + + case ES_ERROR: + //render a red cube + glPushMatrix(); + glPushAttrib(GL_ENABLE_BIT); + glDisable(GL_LIGHTING); + glColor3d(1.0, 0.0, 0.0); + glTranslated(0.0, 0.0, -5.0); + glutSolidCube(5.0); + glPopAttrib(); + glPopMatrix(); + break; + + case ES_GET_READY: + Render_Basics(f_uiElapsedTime); + //render some GET READY text + break; + + case ES_PLAYING_GRAB_BLOCK: + Render_Basics(f_uiElapsedTime); + break; + + case ES_PLAYING_PUT_BLOCK: + Render_Basics(f_uiElapsedTime); + break; + + case ES_PAUSED: + Render_Basics(f_uiElapsedTime); + //render menu?? + break; + + case ES_FINISHED: + //render results... + break; + } + + //glPushMatrix(); + + //double l_dSeconds = (double)f_uiElapsedTime/1000.0; + + //glRotated(l_dSeconds * 5.0, 0.0, 1.0, 0.0); + ////glRotated(l_dSeconds * 10, 0.0, 0.0, 1.0); + + //m_pEnvMap->Render(); + + //glPopMatrix(); + + //m_pBox[0]->Render(); + + //for(int i=0; i<4; i++) + //{ + // glPushMatrix(); + // m_pBlock[i]->Render(f_uiElapsedTime); + // glPopMatrix(); + //} + +} + +bool C_MatchBloxEngine::NewGame(int f_iUserID, int f_iGameId, BoxSize f_BS) +{ + if(m_State == ES_INITIALISED) + { + //log new game + + //prepare a fresh box + m_CurrentBox = f_BS; + m_pBox[(int)m_CurrentBox]->RandomizeTiles(); + + //set state to GET READY + m_State = ES_GET_READY; + + //init object positions + m_pBox[(int)m_CurrentBox]->SetPos(0.0, -6.0, -15.0); + return true; + } + + return false; +} + +bool C_MatchBloxEngine::StartGame() +{ + return false; +} + +bool C_MatchBloxEngine::Pause() +{ + //only pause when playing + if (m_State == ES_PLAYING_GRAB_BLOCK || + m_State == ES_PLAYING_PUT_BLOCK) + { + //save current state + m_SavedState = m_State; + + //probably do something with a time variable + + //set current state to paused + m_State = ES_PAUSED; + + return true; + } + + return false; +} + +bool C_MatchBloxEngine::Resume() +{ + if (m_State == ES_PAUSED) + { + //restore previous state + m_State = m_SavedState; + + //restore timers + // + + return true; + } + return false; +} + +bool C_MatchBloxEngine::Abort() +{ + //abort when not in error or init state + if (m_State != ES_ERROR && m_State != ES_INITIALISED) + { + //set state to initialised + m_State = ES_INITIALISED; + + //.. + + return true; + } + return false; +} + +bool C_MatchBloxEngine::LoadModels(const char* f_strModelDir) +{ + MatProps_t l_Mat; + std::string l_BaseName = f_strModelDir; + + //create the environment mapped cube + m_pEnvMap = new C_Environment("envmaps/terrain_", 50.0); + + //load the bitmaps for the textures + LoadTexture((l_BaseName + "/wood1.bmp").c_str(), m_uiWood1Tex); + LoadTexture((l_BaseName + "/wood2.bmp").c_str(), m_uiWood2Tex); + LoadTexture((l_BaseName + "/wood3.bmp").c_str(), m_uiWood3Tex); + + //load the block models + //red squares + l_Mat.setAmb(1.0, 0.0, 0.0, 1.0); + l_Mat.setDif(1.0, 0.0, 0.0, 1.0); + m_pBlock[BT_SQUARE] = new C_Block((l_BaseName + "/square.obj").c_str(), + m_uiWood1Tex, l_Mat); + if (!m_pBlock[BT_SQUARE]->Initialized()) return false; + + //yellow cricles + l_Mat.setAmb(0.0, 1.0, 1.0, 1.0); + l_Mat.setDif(0.0, 1.0, 1.0, 1.0); + m_pBlock[BT_CIRCLE] = new C_Block((l_BaseName + "/circle.obj").c_str(), + m_uiWood1Tex, l_Mat); + if (!m_pBlock[BT_CIRCLE]->Initialized()) return false; + + //green triangles + l_Mat.setAmb(0.0, 1.0, 0.0, 1.0); + l_Mat.setDif(0.0, 1.0, 0.0, 1.0); + m_pBlock[BT_TRIANGLE] = new C_Block((l_BaseName + "/triangle.obj").c_str(), + m_uiWood1Tex, l_Mat); + if (!m_pBlock[BT_TRIANGLE]->Initialized()) return false; + + //blue crosses + l_Mat.setAmb(0.0, 0.0, 1.0, 1.0); + l_Mat.setDif(0.0, 0.0, 1.0, 1.0); + m_pBlock[BT_CROSS] = new C_Block((l_BaseName + "/cross.obj").c_str(), + m_uiWood1Tex, l_Mat); + if (!m_pBlock[BT_CROSS]->Initialized()) return false; + + + //load the hand??? + + + //Load the box tiles + l_Mat.setAmb(1.0, 1.0, 1.0, 1.0); + l_Mat.setDif(1.0, 1.0, 1.0, 1.0); + + m_pTiles[BT_SQUARE] = new C_3DObject((l_BaseName + "/tile_square.obj").c_str(), + m_uiWood3Tex, l_Mat); + if (!m_pTiles[BT_SQUARE]->Initialized()) return false; + + m_pTiles[BT_CIRCLE] = new C_3DObject((l_BaseName + "/tile_circle.obj").c_str(), + m_uiWood3Tex, l_Mat); + if (!m_pTiles[BT_CIRCLE]->Initialized()) return false; + + m_pTiles[BT_TRIANGLE] = new C_3DObject((l_BaseName + "/tile_triangle.obj").c_str(), + m_uiWood3Tex, l_Mat); + if (!m_pTiles[BT_TRIANGLE]->Initialized()) return false; + + m_pTiles[BT_CROSS] = new C_3DObject((l_BaseName + "/tile_cross.obj").c_str(), + m_uiWood3Tex, l_Mat); + if (!m_pTiles[BT_CROSS]->Initialized()) return false; + + m_pTiles[4] = new C_3DObject((l_BaseName + "/tile_no_hole.obj").c_str(), + m_uiWood3Tex, l_Mat); + if (!m_pTiles[4]->Initialized()) return false; + + + //Load the box models + m_pBox[0] = new C_Box((l_BaseName + "/box_small.obj").c_str(), + m_uiWood2Tex, l_Mat, 2, 2, m_pTiles); + if (!m_pBox[0]->Initialized()) return false; + + m_pBox[1] = new C_Box((l_BaseName + "/box_med.obj").c_str(), + m_uiWood2Tex, l_Mat, 4, 2, m_pTiles); + if (!m_pBox[1]->Initialized()) return false; + + m_pBox[2] = new C_Box((l_BaseName + "/box_large.obj").c_str(), + m_uiWood2Tex, l_Mat, 4, 4, m_pTiles); + if (!m_pBox[2]->Initialized()) return false; + + + return true; +} + +void C_MatchBloxEngine::DeleteModels() +{ + //delete objects + delete m_pEnvMap; + delete m_pBlock[0]; + delete m_pBlock[1]; + delete m_pBlock[2]; + delete m_pBlock[3]; + //delete m_pHand; + delete m_pBox[0]; + delete m_pBox[1]; + delete m_pBox[2]; + delete m_pTiles[0]; + delete m_pTiles[1]; + delete m_pTiles[2]; + delete m_pTiles[3]; + delete m_pTiles[4]; + + //delete textures + glDeleteTextures(1, &m_uiWood1Tex); + glDeleteTextures(1, &m_uiWood2Tex); + glDeleteTextures(1, &m_uiWood3Tex); +} + +void C_MatchBloxEngine::LoadTexture(const char* f_BmpName, GLuint &f_uiTexHandle) +{ + BitmapStruct l_Bmp; + + l_Bmp = BitmapLoad((char*)f_BmpName); + f_uiTexHandle = (GLuint)l_Bmp.m_iImageId; + + glBindTexture(GL_TEXTURE_2D, f_uiTexHandle); + + //set the texture paramaters + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); +} + diff --git a/matchblox/C_MatchBloxEngine.h b/matchblox/C_MatchBloxEngine.h new file mode 100644 index 0000000..97aa892 --- /dev/null +++ b/matchblox/C_MatchBloxEngine.h @@ -0,0 +1,87 @@ +#ifndef C_MATCHBLOXENGINE_HEADER_FILE + +#define C_MATCHBLOXENGINE_HEADER_FILE + +#include "MessageQueue.h" + +class C_3DObject; +class C_Block; +class C_Hand; +class C_Log; +class C_Environment; +class C_Box; + +typedef enum GameResult +{ + GR_FINISHED, + GR_BUSY, + GR_ERROR +} GameResult; + +enum EngineState +{ + ES_INITIALISED, + ES_ERROR, + ES_GET_READY, //game initialised, waiting for start signal from player + ES_PLAYING_GRAB_BLOCK, //no block in hand -> grab floating block + ES_PLAYING_PUT_BLOCK, //block in hand -> put block in box + ES_PAUSED, //pause... + ES_FINISHED //finished -> show score and goto init +}; + +enum BlockType +{ + BT_SQUARE = 0, + BT_CIRCLE = 1, + BT_TRIANGLE = 2, + BT_CROSS = 3 +}; + +enum BoxSize +{ + BS_SMALL = 0, + BS_MED = 1, + BS_LARGE = 2 +}; + + +class C_MatchBloxEngine +{ +public: + C_MatchBloxEngine(const char *f_strModelPath, + const char *f_strLogFile); + ~C_MatchBloxEngine(); + + GameResult GameStep(msgQueue &f_Queue); + void Render(unsigned int f_uiElapsedTime); + + bool NewGame(int f_iUserID, int f_iGameId, BoxSize f_BS); + bool StartGame(); + bool Pause(); + bool Resume(); + bool Abort(); + +private: + C_Environment *m_pEnvMap; + C_Block *m_pBlock[4]; + C_Hand *m_pHand; + C_3DObject *m_pTiles[5]; + C_Box *m_pBox[3]; + C_Log *m_pLog; + + GLuint m_uiWood1Tex, + m_uiWood2Tex, + m_uiWood3Tex; + + EngineState m_State, m_SavedState; + BoxSize m_CurrentBox; + + void Render_Basics(unsigned int f_uiElapsedTime); + + bool LoadModels(const char* f_strModelDir); + void DeleteModels(); + void LoadTexture(const char* f_BmpName, GLuint &f_uiTexHandle); +}; + +#endif //C_MATCHBLOXENGINE_HEADER_FILE + diff --git a/matchblox/ChangeLog b/matchblox/ChangeLog deleted file mode 100644 index c9b8f0e..0000000 --- a/matchblox/ChangeLog +++ /dev/null @@ -1,18 +0,0 @@ -2007-12-28 Johannes Schmid,,, - - reviewed by: - - * project.anjuta: - -2007-12-23 Johannes Schmid,,, - - reviewed by: - - * src/Makefile.am.tpl: - -2007-12-23 Johannes Schmid,,, - - reviewed by: - - * src/Makefile.am.tpl: - diff --git a/matchblox/Makefile b/matchblox/Makefile new file mode 100644 index 0000000..0222105 --- /dev/null +++ b/matchblox/Makefile @@ -0,0 +1,43 @@ +CFLAGS=-Icommon -Imenu -Iengine -O2 +CXXFLAGS=$(CFLAGS) +LDFLAGS=-lglut +CXX=g++ +CC=gcc + + +all: matchblox_menu matchblox_engine + $(CXX) $(LDFLAGS) main.o bitmap.o button.o font.o menu.o C_3DObject.o C_Hand.o C_Block.o C_Log.o C_Environment.o C_Box.o C_MatchBloxEngine.o -o MatchBlox + + +matchblox_common: + $(CC) $(CFLAGS) -o message_queue -c common/message_queue.c + $(CC) $(CFLAGS) -o bitmap.o -c common/bitmap.c + $(CC) $(CFLAGS) -o font.o -c common/font.c + +matchblox_menu: matchblox_common + $(CC) $(CFLAGS) -o button.o -c menu/button.c + $(CC) $(CFLAGS) -o menu.o -c menu/menu.c + +matchblox_engine: matchblox_common + $(CXX) $(CXXFLAGS) -o C_3DObject.o -c engine/C_3DObject.cpp + $(CXX) $(CXXFLAGS) -o C_Hand.o -c engine/C_Hand.cpp + $(CXX) $(CXXFLAGS) -o C_Block.o -c engine/C_Block.cpp + $(CXX) $(CXXFLAGS) -o C_Log.o -c engine/C_Log.cpp + $(CXX) $(CXXFLAGS) -o C_Environment.o -c engine/C_Environment.cpp + $(CXX) $(CXXFLAGS) -o C_Box.o -c engine/C_Box.cpp + $(CXX) $(CXXFLAGS) -o C_MatchBloxEngine.o -c engine/C_MatchBloxEngine.cpp + $(CXX) $(CXXFLAGS) -o main.o -c main.cpp + +#automatically generate targets with their dependencies +%.d: %.cpp + @set -e; rm -f $@; \ + $(CC) -M $(CFLAGS) $< > $@.$$$$; \ + sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \ + rm -f $@.$$$$ + +#include the automatically generated targets +include $(sources:.cpp=.d) + +clean: + -rm MatchBlox *.o *.d + diff --git a/matchblox/Makefile.am b/matchblox/Makefile.am deleted file mode 100644 index c473cf2..0000000 --- a/matchblox/Makefile.am +++ /dev/null @@ -1,32 +0,0 @@ -## Process this file with automake to produce Makefile.in -## Created by Anjuta - -SUBDIRS = src - -matchbloxdocdir = ${prefix}/doc/matchblox -matchbloxdoc_DATA = \ - README\ - COPYING\ - AUTHORS\ - ChangeLog\ - INSTALL\ - NEWS - -EXTRA_DIST = $(matchbloxdoc_DATA) - -bin_PROGRAMS = \ - matchblox - -matchblox_SOURCES = \ - src/main.c \ - src/renderer_opengl.c \ - src/renderer_opengl.h - -# Copy all the spec files. Of cource, only one is actually used. -dist-hook: - for specfile in *.spec; do \ - if test -f $$specfile; then \ - cp -p $$specfile $(distdir); \ - fi \ - done - diff --git a/matchblox/NEWS b/matchblox/NEWS deleted file mode 100644 index e69de29..0000000 diff --git a/matchblox/README b/matchblox/README deleted file mode 100644 index e69de29..0000000 diff --git a/matchblox/TODO.tasks b/matchblox/TODO.tasks deleted file mode 100644 index d1fa282..0000000 --- a/matchblox/TODO.tasks +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/matchblox/autogen.sh b/matchblox/autogen.sh deleted file mode 100755 index 9ab346a..0000000 --- a/matchblox/autogen.sh +++ /dev/null @@ -1,159 +0,0 @@ -#!/bin/sh -# Run this to generate all the initial makefiles, etc. - -srcdir=`dirname $0` -test -z "$srcdir" && srcdir=. - -DIE=0 - -if [ -n "$GNOME2_DIR" ]; then - ACLOCAL_FLAGS="-I $GNOME2_DIR/share/aclocal $ACLOCAL_FLAGS" - LD_LIBRARY_PATH="$GNOME2_DIR/lib:$LD_LIBRARY_PATH" - PATH="$GNOME2_DIR/bin:$PATH" - export PATH - export LD_LIBRARY_PATH -fi - -(test -f $srcdir/configure.ac) || { - echo -n "**Error**: Directory "\`$srcdir\'" does not look like the" - echo " top-level package directory" - exit 1 -} - -(autoconf --version) < /dev/null > /dev/null 2>&1 || { - echo - echo "**Error**: You must have \`autoconf' installed." - echo "Download the appropriate package for your distribution," - echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/" - DIE=1 -} - -(grep "^IT_PROG_INTLTOOL" $srcdir/configure.ac >/dev/null) && { - (intltoolize --version) < /dev/null > /dev/null 2>&1 || { - echo - echo "**Error**: You must have \`intltool' installed." - echo "You can get it from:" - echo " ftp://ftp.gnome.org/pub/GNOME/" - DIE=1 - } -} - -(grep "^AM_PROG_XML_I18N_TOOLS" $srcdir/configure.ac >/dev/null) && { - (xml-i18n-toolize --version) < /dev/null > /dev/null 2>&1 || { - echo - echo "**Error**: You must have \`xml-i18n-toolize' installed." - echo "You can get it from:" - echo " ftp://ftp.gnome.org/pub/GNOME/" - DIE=1 - } -} - -(grep "^AM_PROG_LIBTOOL" $srcdir/configure.ac >/dev/null) && { - (libtool --version) < /dev/null > /dev/null 2>&1 || { - echo - echo "**Error**: You must have \`libtool' installed." - echo "You can get it from: ftp://ftp.gnu.org/pub/gnu/" - DIE=1 - } -} - -(grep "^AM_GLIB_GNU_GETTEXT" $srcdir/configure.ac >/dev/null) && { - (grep "sed.*POTFILES" $srcdir/configure.ac) > /dev/null || \ - (glib-gettextize --version) < /dev/null > /dev/null 2>&1 || { - echo - echo "**Error**: You must have \`glib' installed." - echo "You can get it from: ftp://ftp.gtk.org/pub/gtk" - DIE=1 - } -} - -(automake --version) < /dev/null > /dev/null 2>&1 || { - echo - echo "**Error**: You must have \`automake' installed." - echo "You can get it from: ftp://ftp.gnu.org/pub/gnu/" - DIE=1 - NO_AUTOMAKE=yes -} - - -# if no automake, don't bother testing for aclocal -test -n "$NO_AUTOMAKE" || (aclocal --version) < /dev/null > /dev/null 2>&1 || { - echo - echo "**Error**: Missing \`aclocal'. The version of \`automake'" - echo "installed doesn't appear recent enough." - echo "You can get automake from ftp://ftp.gnu.org/pub/gnu/" - DIE=1 -} - -if test "$DIE" -eq 1; then - exit 1 -fi - -if test -z "$*"; then - echo "**Warning**: I am going to run \`configure' with no arguments." - echo "If you wish to pass any to it, please specify them on the" - echo \`$0\'" command line." - echo -fi - -case $CC in -xlc ) - am_opt=--include-deps;; -esac - -for coin in `find $srcdir -path $srcdir/CVS -prune -o -name configure.ac -print` -do - dr=`dirname $coin` - if test -f $dr/NO-AUTO-GEN; then - echo skipping $dr -- flagged as no auto-gen - else - echo processing $dr - ( cd $dr - - aclocalinclude="$ACLOCAL_FLAGS" - - if grep "^AM_GLIB_GNU_GETTEXT" configure.ac >/dev/null; then - echo "Creating $dr/aclocal.m4 ..." - test -r $dr/aclocal.m4 || touch $dr/aclocal.m4 - echo "Running glib-gettextize... Ignore non-fatal messages." - echo "no" | glib-gettextize --force --copy - echo "Making $dr/aclocal.m4 writable ..." - test -r $dr/aclocal.m4 && chmod u+w $dr/aclocal.m4 - fi - if grep "^IT_PROG_INTLTOOL" configure.ac >/dev/null; then - echo "Running intltoolize..." - intltoolize --copy --force --automake - fi - if grep "^AM_PROG_XML_I18N_TOOLS" configure.ac >/dev/null; then - echo "Running xml-i18n-toolize..." - xml-i18n-toolize --copy --force --automake - fi - if grep "^AM_PROG_LIBTOOL" configure.ac >/dev/null; then - if test -z "$NO_LIBTOOLIZE" ; then - echo "Running libtoolize..." - libtoolize --force --copy - fi - fi - echo "Running aclocal $aclocalinclude ..." - aclocal $aclocalinclude - if grep "^AM_CONFIG_HEADER" configure.ac >/dev/null; then - echo "Running autoheader..." - autoheader - fi - echo "Running automake --gnu $am_opt ..." - automake --add-missing --gnu $am_opt - echo "Running autoconf ..." - autoconf - ) - fi -done - -conf_flags="--enable-maintainer-mode" - -if test x$NOCONFIGURE = x; then - echo Running $srcdir/configure $conf_flags "$@" ... - $srcdir/configure $conf_flags "$@" \ - && echo Now type \`make\' to compile. || exit 1 -else - echo Skipping configure process. -fi diff --git a/matchblox/bitmap.cpp b/matchblox/bitmap.cpp new file mode 100644 index 0000000..243952a --- /dev/null +++ b/matchblox/bitmap.cpp @@ -0,0 +1,98 @@ +#ifdef G_OS_WIN32 + #define WIN32_LEAN_AND_MEAN 1 + #include + #define GL_BGR 0x80E0 + #define GL_BGRA 0x80E1 +#endif + +#include +#include +#include +#include + +#include "bitmap.h" + +#define BITMAP_FILESIZE 0x02 +#define BITMAP_OFFSET 0x0a +#define BITMAP_HEADERSIZE 0x0e +#define BITMAP_WIDTH 0x12 +#define BITMAP_HEIGHT 0x16 +#define BITMAP_DEPTH 0x1c +#define BITMAP_IMAGE_SIZE 0x22 + + +struct BitmapStruct BitmapLoad(char *filename) +{ + struct BitmapStruct l_sImage; + GLuint texture; + FILE *bitmap; + + // try to open the file + bitmap = fopen(filename, "r"); + + // does the bitmap exist? + if (bitmap > 0) + { + unsigned int dataoffset, filesize, imagesize; + short depth; + GLsizei width, height; + unsigned char *imagedata; + + fseek(bitmap, BITMAP_FILESIZE, SEEK_SET); + fread(&filesize, 4, 1, bitmap); + fseek(bitmap, BITMAP_OFFSET, SEEK_SET); + fread(&dataoffset, 4, 1, bitmap); + fseek(bitmap, BITMAP_WIDTH, SEEK_SET); + fread(&width, 4, 1, bitmap); + fread(&height, 4, 1, bitmap); + fseek(bitmap, BITMAP_DEPTH, SEEK_SET); + fread(&depth, 2, 1, bitmap); + fseek(bitmap, BITMAP_IMAGE_SIZE, SEEK_SET); + fread(&imagesize, 4, 1, bitmap); + + imagedata = (unsigned char *)malloc((size_t)imagesize); + + fseek(bitmap, dataoffset, SEEK_SET); + fread(imagedata, (size_t)imagesize, 1, bitmap); + + glGenTextures(1, &texture); + glBindTexture(GL_TEXTURE_2D, texture); + + if (depth == 24) // 24 bits + { + gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, width, height, GL_BGR, GL_UNSIGNED_BYTE, imagedata); + } + else // depth == 32 bits + { + gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, width, height, GL_BGRA, GL_UNSIGNED_BYTE, imagedata);; + } + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + + l_sImage.m_iImageId = texture; + l_sImage.m_iWidth = width; + l_sImage.m_iHeight = height; + + free(imagedata); + fclose(bitmap); + + return l_sImage; + } + else + { + // couldn't find bitmap + exit(0); + } +} + + + +void BitmapConvertWidth(struct BitmapStruct *f_sImage, double f_dHeight) +{ + double l_dRatio; + + l_dRatio = (double)f_sImage->m_iHeight / f_dHeight; + f_sImage->m_iWidth = (int)(f_sImage->m_iWidth / l_dRatio); + +} // ConvertButton diff --git a/matchblox/bitmap.h b/matchblox/bitmap.h new file mode 100644 index 0000000..5aa9be6 --- /dev/null +++ b/matchblox/bitmap.h @@ -0,0 +1,24 @@ +#ifndef _CBITMAP_H +#define _CBITMAP_H + +#ifdef __cplusplus +extern "C" { +#endif + + +struct BitmapStruct { + int m_iImageId; + int m_iWidth; + int m_iHeight; +}; + +struct BitmapStruct BitmapLoad(char *filename); +void BitmapRender(int f_iXPos, int f_iYPos, int f_iWidth, int f_iHeight, int f_iImageId); +void BitmapConvertWidth(struct BitmapStruct *f_sImage, double f_dHeight); + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/matchblox/common/bitmap.c b/matchblox/common/bitmap.c new file mode 100644 index 0000000..2d69bc9 --- /dev/null +++ b/matchblox/common/bitmap.c @@ -0,0 +1,114 @@ +#ifdef G_OS_WIN32 + #define WIN32_LEAN_AND_MEAN 1 + #include + #define GL_BGR 0x80E0 + #define GL_BGRA 0x80E1 + #define GL_CLAMP_TO_EDGE 0x812F +#endif + +#include +#include +#include +#include + +#include "bitmap.h" + +#define BITMAP_FILESIZE 0x02 +#define BITMAP_OFFSET 0x0a +#define BITMAP_HEADERSIZE 0x0e +#define BITMAP_WIDTH 0x12 +#define BITMAP_HEIGHT 0x16 +#define BITMAP_DEPTH 0x1c +#define BITMAP_IMAGE_SIZE 0x22 + + +struct BitmapStruct BitmapLoad(char *filename) +{ + struct BitmapStruct l_sImage; + GLuint texture; + FILE *bitmap; + + // try to open the file + bitmap = fopen(filename, "r"); + + // does the bitmap exist? + if (bitmap > 0) + { + unsigned int dataoffset, filesize, imagesize; + short depth; + GLsizei width, height; + unsigned char *imagedata; + + fseek(bitmap, BITMAP_FILESIZE, SEEK_SET); + fread(&filesize, 4, 1, bitmap); + fseek(bitmap, BITMAP_OFFSET, SEEK_SET); + fread(&dataoffset, 4, 1, bitmap); + fseek(bitmap, BITMAP_WIDTH, SEEK_SET); + fread(&width, 4, 1, bitmap); + fread(&height, 4, 1, bitmap); + fseek(bitmap, BITMAP_DEPTH, SEEK_SET); + fread(&depth, 2, 1, bitmap); + fseek(bitmap, BITMAP_IMAGE_SIZE, SEEK_SET); + fread(&imagesize, 4, 1, bitmap); + + imagedata = (unsigned char *)malloc((size_t)imagesize); + + fseek(bitmap, dataoffset, SEEK_SET); + fread(imagedata, (size_t)imagesize, 1, bitmap); + + glGenTextures(1, &texture); + glBindTexture(GL_TEXTURE_2D, texture); + + if (depth == 24) // 24 bits + { + gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, width, height, GL_BGR, GL_UNSIGNED_BYTE, imagedata); + } + else // depth == 32 bits + { + gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, width, height, GL_BGRA, GL_UNSIGNED_BYTE, imagedata);; + } + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + + l_sImage.m_iImageId = texture; + l_sImage.m_iWidth = width; + l_sImage.m_iHeight = height; + + free(imagedata); + fclose(bitmap); + + return l_sImage; + } + else + { + // couldn't find bitmap + exit(0); + } +} + + +void BitmapRender(int f_iXPos, int f_iYPos, int f_iWidth, int f_iHeight, int f_iImageId) +{ + glBindTexture(GL_TEXTURE_2D, f_iImageId); + + glBegin(GL_TRIANGLE_STRIP); + glTexCoord2i(0, 1); glVertex2i(f_iXPos, f_iYPos); + glTexCoord2i(1, 1); glVertex2i(f_iXPos + f_iWidth, f_iYPos); + glTexCoord2i(0, 0); glVertex2i(f_iXPos, f_iYPos + f_iHeight); + glTexCoord2i(1, 0); glVertex2i(f_iXPos + f_iWidth, f_iYPos + f_iHeight); + glEnd(); + +} // BitmapRender + + +void BitmapConvertWidth(struct BitmapStruct *f_sImage, double f_dHeight) +{ + double l_dRatio; + + l_dRatio = (double)f_sImage->m_iHeight / f_dHeight; + f_sImage->m_iWidth = (int)(f_sImage->m_iWidth / l_dRatio); + +} // ConvertButton diff --git a/matchblox/common/bitmap.h b/matchblox/common/bitmap.h new file mode 100644 index 0000000..5aa9be6 --- /dev/null +++ b/matchblox/common/bitmap.h @@ -0,0 +1,24 @@ +#ifndef _CBITMAP_H +#define _CBITMAP_H + +#ifdef __cplusplus +extern "C" { +#endif + + +struct BitmapStruct { + int m_iImageId; + int m_iWidth; + int m_iHeight; +}; + +struct BitmapStruct BitmapLoad(char *filename); +void BitmapRender(int f_iXPos, int f_iYPos, int f_iWidth, int f_iHeight, int f_iImageId); +void BitmapConvertWidth(struct BitmapStruct *f_sImage, double f_dHeight); + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/matchblox/common/font.c b/matchblox/common/font.c new file mode 100644 index 0000000..0332174 --- /dev/null +++ b/matchblox/common/font.c @@ -0,0 +1,90 @@ +#ifdef G_OS_WIN32 + #define WIN32_LEAN_AND_MEAN 1 + #include +#else + #define FALSE 0 + #define TRUE !FALSE +#endif + +#include +#include + +#include "font.h" +#include "bitmap.h" + +struct BitmapStruct g_sFont; + +int g_iWinWidth; +int g_iWinHeight; + +GLuint g_iBase; + + +void FontInit(int f_iWinWidth, int f_iWinHeight) +{ + float cx; + float cy; + int l_iImageId; + int i = 0; + + float x = (float)(1.0f/FONT_XCHAR); + + g_iWinWidth = f_iWinWidth; + g_iWinHeight = f_iWinHeight; + + g_sFont = BitmapLoad("img/continuum_textured_alpha.bmp"); + l_iImageId = g_sFont.m_iImageId; + + g_iBase = glGenLists(FONT_COUNT); + glBindTexture(GL_TEXTURE_2D, l_iImageId); + + for (i = 0; i < FONT_COUNT; i++) + { + cx = (float)(i % 16) / 16.0f; + cy = (float)(i / 16) / 16.0f; + + glNewList(g_iBase + i, GL_COMPILE); + + glBegin(GL_TRIANGLE_STRIP); + glTexCoord2f(cx, 1 - cy); glVertex2i(0, 0); + glTexCoord2f(cx + x, 1 - cy); glVertex2i(FONT_WIDTH, 0); + glTexCoord2f(cx, 1 - cy - x); glVertex2i(0, FONT_HEIGHT); + glTexCoord2f(cx + x, 1 - cy - x); glVertex2i(FONT_WIDTH, FONT_HEIGHT); + glEnd(); + + glTranslated(FONT_SPACING, 0, 0); + glEndList(); + } + +} // BuildFont + + +void FontDelete(void) +{ + glDeleteLists(g_iBase, FONT_COUNT); + +} // FontDelete + + +void glPrint(GLint x, GLint y, char *string, struct ColorStruct f_sColor) +{ + glColor3d(f_sColor.m_dRed, f_sColor.m_dGreen, f_sColor.m_dBlue); + glBindTexture(GL_TEXTURE_2D, g_sFont.m_iImageId); + glDisable(GL_DEPTH_TEST); + glMatrixMode(GL_PROJECTION); + + glPushMatrix(); + glLoadIdentity(); + glOrtho(0, g_iWinWidth, g_iWinHeight, 0, 0, 1); + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + glLoadIdentity(); + glTranslated(x, y, 0); + glListBase(g_iBase - 32); + glCallLists((GLsizei)strlen(string), GL_UNSIGNED_BYTE, string); + glMatrixMode(GL_PROJECTION); + glPopMatrix(); + glMatrixMode(GL_MODELVIEW); + glPopMatrix(); + +} // glPrint diff --git a/matchblox/common/font.h b/matchblox/common/font.h new file mode 100644 index 0000000..ec84ccb --- /dev/null +++ b/matchblox/common/font.h @@ -0,0 +1,30 @@ +#ifndef _CFONT_H +#define _CFONT_H + +#define FONT_WIDTH 32 // width of a character (in the bitmap source!) +#define FONT_HEIGHT 32 // height of a character (in the bitmap source!) +#define FONT_SPACING 20 // spacing between characters when printing +#define FONT_XCHAR 16 // number of characters aligned on the x-axis in the bitmap source +#define FONT_COUNT 256 // number of characters in the bitmap source + + +#ifdef __cplusplus +extern "C" { +#endif + +struct ColorStruct { + double m_dRed; + double m_dGreen; + double m_dBlue; +}; + +void FontInit(int f_iWinWidth, int f_iWinHeight); +void FontDelete(GLvoid); +void glPrint(GLint x, GLint y, char *string, struct ColorStruct f_sColor); + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/matchblox/common/message_queue.c b/matchblox/common/message_queue.c new file mode 100644 index 0000000..ad28b6e --- /dev/null +++ b/matchblox/common/message_queue.c @@ -0,0 +1,101 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 2; tab-width: 2 -*- */ +/* + * message_queue.c + * Copyright (C) Oliver 2008 + * + * main.c is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * main.c is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +#ifdef G_OS_WIN32 +#define WIN32_LEAN_AND_MEAN 1 +#include +#endif + +#include +#include +#include + +#include "message_queue.h" + + +#define MAX_MESSAGES MESSAGE_WINDOW_SIZE + + +struct messageq_s messageq[MAX_MESSAGES]; +static int messageq_index, messageq_serial; +static int messageq_last_free; + + +void messageq_init(void) +{ + int i; + + messageq_index = 0; + messageq_serial = 0; + messageq_last_free = 0; + for( i = 0; i < MAX_MESSAGES; i++) { + messageq[i].sender = 0; + messageq[i].recipient = 0; + messageq[i].payload = NULL; + messageq[i].payload_size = 0; + } +} + + +static void msgcpy(struct messageq_s *dest, const struct messageq_s *src) +{ + dest->sender = src->sender; + dest->recipient = src->recipient; + dest->payload = (void *)malloc(src->payload_size); + memcpy(dest->payload, src->payload, src->payload_size); + dest->payload_size = src->payload_size; +} + +static void msgfree(int index) { + messageq[index].sender = 0; + messageq[index].recipient = 0; + free(messageq[index].payload); + messageq[index].payload_size = 0; +} + + +struct messageq_s *messageq_get(int recipient) +{ + int i; + + i = messageq_index; + while (messageq[i].recipient != recipient && i != (messageq_index -1)) { + i = (i < MAX_MESSAGES -1) ? i +1 : 0; + } + + /* + * We found the message for our recipient. We'll now set the recipient field to 0 since the recipient + * should know the message was for him, he asked for it. This is needed to prefent the above loop + * to find the same message again, since the message will stay alive in the system until its expired. + */ + messageq[i].recipient = MESSAGE_NONE; + + return &messageq[i]; +} + + +void messageq_send(struct messageq_s *message) +{ + /* Before sending the message, we clean out old cruft. We do this here + * since we will be overwriting the contens of the message here anyway. + */ + msgfree(messageq_index); + msgcpy(&messageq[messageq_index], message); + messageq_index = ++messageq_serial %MAX_MESSAGES; +} diff --git a/matchblox/common/message_queue.h b/matchblox/common/message_queue.h new file mode 100644 index 0000000..9fd1241 --- /dev/null +++ b/matchblox/common/message_queue.h @@ -0,0 +1,37 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 2; tab-width: 2 -*- */ +#ifndef _CMESSAGE_QUEUE_H +#define _CMESSAGE_QUEUE_H + + +#define MESSAGE_NONE 0x000000 +#define MESSAGE_MENU 0x001000 +#define MESSAGE_RENDERER 0x002000 + +#define MESSAGE_WINDOW_SIZE 16 + + +#ifdef __cplusplus +extern "C" { +#endif + + +struct messageq_s +{ + int recipient; + int sender; + void *payload; + size_t payload_size; +}; + + +void messageq_init(void); + +void messageq_send(struct messageq_s *message); + +struct messageq_s *messageq_get(int recipient); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/matchblox/configure.ac b/matchblox/configure.ac deleted file mode 100644 index fe2bee6..0000000 --- a/matchblox/configure.ac +++ /dev/null @@ -1,29 +0,0 @@ -dnl Process this file with autoconf to produce a configure script. -dnl Created by Anjuta application wizard. - -AC_INIT(matchblox, 0.1) - -AM_INIT_AUTOMAKE(AC_PACKAGE_NAME, AC_PACKAGE_VERSION) -AM_CONFIG_HEADER(config.h) -AM_MAINTAINER_MODE - -AC_ISC_POSIX -AC_PROG_CC -AM_PROG_CC_STDC -AC_HEADER_STDC - - - - - - - - - - - -AC_OUTPUT([ -Makefile -src/Makefile - -]) diff --git a/matchblox/engine/C_3DObject.cpp b/matchblox/engine/C_3DObject.cpp new file mode 100644 index 0000000..3cb00b1 --- /dev/null +++ b/matchblox/engine/C_3DObject.cpp @@ -0,0 +1,336 @@ +#include +#include +#include +#include +#include + +#include "typedefs.h" +#include "C_3DObject.h" + +#include "bitmap.h" + +C_3DObject::C_3DObject() + : m_Pos(0.0, 0.0, 0.0), m_Rot(0.0, 0.0, 0.0), + m_Scale(1.0, 1.0, 1.0), + m_bOwnTexture(false), + m_bDispListValid(false) +{ + std::cout << "C_3DObject:: default constructor\n"; +} + + +C_3DObject::C_3DObject(const char* f_strFileName, + char* f_strColorTexName, + MatProps_t f_Material) + : m_Pos(0.0, 0.0, 0.0), m_Rot(0.0, 0.0, 0.0), + m_Scale(1.0, 1.0, 1.0), + m_bOwnTexture(false), + m_bDispListValid(false), + m_Mat(f_Material) +{ + BitmapStruct l_bmp; + + //load 3d model + m_bDispListValid = CreateObject(f_strFileName); + + //load textures + if (m_bDispListValid) + { + if (f_strColorTexName != NULL) + { + std::cout << "Loading " << f_strColorTexName << std::endl; + l_bmp = BitmapLoad(f_strColorTexName); + m_uiColorTex = (GLuint)l_bmp.m_iImageId; + m_bOwnTexture = true; + } + } +} + +C_3DObject::C_3DObject(const char* f_strFileName, + GLuint f_uiTexture, + MatProps_t f_Material) + : m_Pos(0.0, 0.0, 0.0), m_Rot(0.0, 0.0, 0.0), + m_Scale(1.0, 1.0, 1.0), + m_bOwnTexture(false), + m_bDispListValid(false), + m_uiColorTex(f_uiTexture), + m_Mat(f_Material) +{ + //load 3d model + m_bDispListValid = CreateObject(f_strFileName); + +} + +C_3DObject::~C_3DObject() +{ + if (glIsList(m_uiListIndex)) + glDeleteLists(m_uiListIndex, 1); + + if (glIsTexture(m_uiColorTex) && m_bOwnTexture) + glDeleteTextures(1, &m_uiColorTex); +} + +void C_3DObject::TransRotateScale() +{ + glScaled(m_Scale.x, m_Scale.y, m_Scale.z); + glTranslated(m_Pos.x, m_Pos.y, m_Pos.z); + glRotated(m_Rot.z, 0.0, 0.0, 1.0); + glRotated(m_Rot.x, 1.0, 0.0, 0.0); + glRotated(m_Rot.y, 0.0, 1.0, 0.0); +} + +void C_3DObject::Render() +{ + //apply OpenGL settings for rendering this Object + glPushAttrib(GL_TEXTURE_BIT); + glEnable(GL_TEXTURE_2D); + //modulate the texture color with the computed material + //colors + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); + glBindTexture(GL_TEXTURE_2D, m_uiColorTex); + + //set material properties + glMaterialfv(GL_FRONT, GL_AMBIENT, m_Mat.m_fAmb); + glMaterialfv(GL_FRONT, GL_DIFFUSE, m_Mat.m_fDif); + glMaterialfv(GL_FRONT, GL_SPECULAR, m_Mat.m_fSpec); + glMaterialfv(GL_FRONT, GL_EMISSION, m_Mat.m_fEmi); + glMaterialf(GL_FRONT, GL_SHININESS, m_Mat.m_fShin); + +/* + //scale translate and rotate + glPushMatrix(); + + glScaled(m_Scale.x, m_Scale.y, m_Scale.z); + glTranslated(m_Pos.x, m_Pos.y, m_Pos.z); + glRotated(m_Rot.z, 0.0, 0.0, 1.0); + glRotated(m_Rot.x, 1.0, 0.0, 0.0); + glRotated(m_Rot.y, 0.0, 1.0, 0.0); +*/ + + //render by calling the display list + if(m_bDispListValid) + { + glCallList(m_uiListIndex); + } + else + { + //or render a LARGE cube when we failed to load the + //geometry + glutSolidCube(10.0); + } + +// glPopMatrix(); + + glPopAttrib(); +} + + + +bool C_3DObject::CreateObject(const char *f_pFilePath) +{ + Geometry_t l_Geom; + bool l_bParseOk; + Vect3D_t l_DummyVect; + + //the triangle indices are 1-based so we insert dummy Vect3D_t + //to fill the 0 positions in the vertex, normals and texcoords + //vector containers. + l_Geom.m_verts.push_back(l_DummyVect); + l_Geom.m_norms.push_back(l_DummyVect); + l_Geom.m_texs.push_back(l_DummyVect); + + l_bParseOk = LoadGeometryData(f_pFilePath, l_Geom); + + //output statistics + std::cout << "C_3DObject: file " << f_pFilePath + << "\nParse: " << (l_bParseOk? "SUCCESS" : "FAILURE") + << "\nVertices: " << l_Geom.m_verts.size()-1 + << "\nNormals: " << l_Geom.m_norms.size()-1 + << "\nTexCrds: " << l_Geom.m_texs.size()-1 + << "\nTriangles: " << l_Geom.m_triangles.size() + << "\nBoundBox: x(" << m_BBox.m_dLeft << "," << m_BBox.m_dRight << ")" + << "\n y(" << m_BBox.m_dBottom << "," << m_BBox.m_dTop << ")" + << "\n z(" << m_BBox.m_dFront << "," << m_BBox.m_dBack << ")" + << std::endl; + + if(!l_bParseOk) + { + std::cout << "C_3DObject Error: failed to parse file " + << f_pFilePath << std::endl; + + return false; + } + + //create display list + m_uiListIndex = glGenLists(1); + glNewList(m_uiListIndex, GL_COMPILE); + + glBegin(GL_TRIANGLES); + + //iterate through the triangles + std::vector::iterator it = l_Geom.m_triangles.begin(); + for(; it != l_Geom.m_triangles.end(); it++) + { + //vertex1 + Vect3D_t v = l_Geom.m_verts[it->v1], + t = l_Geom.m_texs[it->t1], + n = l_Geom.m_norms[it->n1]; + + glNormal3d(n.x, n.y, n.z); + glTexCoord3d(t.x, t.y, t.z); + glVertex3d(v.x, v.y, v.z); + + //vertex2 + v = l_Geom.m_verts[it->v2], + t = l_Geom.m_texs[it->t2], + n = l_Geom.m_norms[it->n2]; + + glNormal3d(n.x, n.y, n.z); + glTexCoord3d(t.x, t.y, t.z); + glVertex3d(v.x, v.y, v.z); + + //vertex3 + v = l_Geom.m_verts[it->v3], + t = l_Geom.m_texs[it->t3], + n = l_Geom.m_norms[it->n3]; + + glNormal3d(n.x, n.y, n.z); + glTexCoord3d(t.x, t.y, t.z); + glVertex3d(v.x, v.y, v.z);} + + glEnd(); + + glEndList(); + + return true; +} + +bool C_3DObject::LoadGeometryData(const char *f_pFilePath, Geometry_t &f_Geom) +{ + std::ifstream l_infile(f_pFilePath); + char l_inbuffer[256]; + bool l_bParseOk = true; + Vect3D_t l_v3; + Triangle_t l_tri; + + if (l_infile.fail()) + { + std::cout << "C_3DObject Error: could not open file " + << f_pFilePath << std::endl; + + return false; + } + + + //load data + while(!l_infile.eof() && l_bParseOk) + { + //read the next line + l_infile.getline(l_inbuffer, 256); + + //check if reading succeeded + if (l_infile.eof() || l_infile.fail() || l_infile.bad()) + { + break; + } + + //try to parse the first string of the line as one of the keywords: + //v -> vertex coordinate + //vt -> texture coordinate + //vn -> vertex normal + //f -> face record + switch (l_inbuffer[0]) + { + case 'v' : + //posibilities 'v' 'vt' 'vn' + switch (l_inbuffer[1]) + { + case ' ': + //vertex + if (l_bParseOk = ParseVect3D(&l_inbuffer[2], l_v3)) + { + f_Geom.m_verts.push_back(l_v3); + //update boundingbox + UpdBBox(m_BBox, l_v3); + } + break; + + case 't': + if (l_inbuffer[2] == ' ') + { + //texture coordinates + if (l_bParseOk = ParseVect3D(&l_inbuffer[3], l_v3)) + { + f_Geom.m_texs.push_back(l_v3); + } + } + break; + + case 'n': + if (l_inbuffer[2] == ' ') + { + //normal + if (l_bParseOk = ParseVect3D(&l_inbuffer[3], l_v3)) + { + f_Geom.m_norms.push_back(l_v3); + } + } + break; + } + break; + + case 'f': + if (l_inbuffer[1] == ' ') + { + //face (triangle) + if (l_bParseOk = ParseTriangle(&l_inbuffer[2], l_tri)) + { + f_Geom.m_triangles.push_back(l_tri); + } + } + break; + + case 'm' : // 'mtllib'? + break; + + case 'u' : // 'usemtl' ? + break; + } + } + + l_infile.close(); + + if (!l_bParseOk) + { + std::cout << "Parse error in: \"" << l_inbuffer << "\"\n"; + } + + return l_bParseOk; +} + +bool C_3DObject::ParseVect3D(const char *f_pInBuffer, Vect3D_t &f_V3) +{ + //format: " x y z " + std::stringstream l_inbuffer(f_pInBuffer); + + l_inbuffer >> std::skipws >> f_V3.x >> f_V3.y >> f_V3.z; + + //std::cout << "Read values: " << f_V3.x << ", " << f_V3.y << ", " << f_V3.z << "\n"; + + return !l_inbuffer.fail(); +} + +bool C_3DObject::ParseTriangle(const char *f_pInBuffer, Triangle_t &f_triangle) +{ + //format v1/vt1/vn1 v2/vt2/vn2 v3/vt3/vn3 + std::stringstream l_inbuffer(f_pInBuffer); + + char l_slash; + + l_inbuffer >> std::skipws >> f_triangle.v1 >> l_slash >> f_triangle.t1 >> l_slash >> f_triangle.n1; + l_inbuffer >> std::skipws >> f_triangle.v2 >> l_slash >> f_triangle.t2 >> l_slash >> f_triangle.n2; + l_inbuffer >> std::skipws >> f_triangle.v3 >> l_slash >> f_triangle.t3 >> l_slash >> f_triangle.n3; + + return !l_inbuffer.fail(); +} + diff --git a/matchblox/engine/C_3DObject.h b/matchblox/engine/C_3DObject.h new file mode 100644 index 0000000..4027596 --- /dev/null +++ b/matchblox/engine/C_3DObject.h @@ -0,0 +1,66 @@ +#ifndef C_3DOBJECT_HEADER_FILE + +#define C_3DOBJECT_HEADER_FILE + +#include +#include + +#include "typedefs.h" + +class C_3DObject +{ +public: + C_3DObject(); + C_3DObject(const char* f_strFileName, + char* f_strColorTexName, + MatProps_t f_Material); + C_3DObject(const char* f_strFileName, + GLuint f_uiTexturei, + MatProps_t f_Material); + + ~C_3DObject(); + + inline void SetPos(double f_dX, double f_dY, double f_dZ) + { m_Pos.x = f_dX; m_Pos.y = f_dY; m_Pos.z = f_dZ; } + inline void SetRot(double f_dX, double f_dY, double f_dZ) + { m_Rot.x = f_dX; m_Rot.y = f_dY; m_Rot.z = f_dZ; } + inline void SetScale(double f_dX, double f_dY, double f_dZ) + { m_Scale.x = f_dX; m_Scale.y = f_dY; m_Scale.z = f_dZ; } + inline void SetPos(const Vect3D_t &pos) + { m_Pos = pos; } + inline void SetRot(const Vect3D_t &rot) + { m_Rot = rot; } + inline void SetScale(const Vect3D_t &scale) + { m_Scale = scale; } + + inline const Vect3D_t& GetPos() { return m_Pos; } + inline const Vect3D_t& GetRot() { return m_Rot; } + inline const Vect3D_t& GetScale() { return m_Scale; } + inline const BoundingBox_t& GetBoundingBox() { return m_BBox; } + inline bool Initialized() { return m_bDispListValid; } + + void TransRotateScale(); //applies the scaling, translation and rotation + //for this object + virtual void Render(); //renders the object using the current projection + //and modelview matrices + +protected: + Vect3D_t m_Pos, + m_Rot, + m_Scale; + + BoundingBox_t m_BBox; //bounding box of the object + GLuint m_uiListIndex; //display list index + bool m_bDispListValid; + GLuint m_uiColorTex; + bool m_bOwnTexture; + MatProps_t m_Mat; + + bool CreateObject(const char *f_pFilePath); + bool LoadGeometryData(const char *f_pFilePath, Geometry_t &f_Geom); + bool ParseVect3D(const char *f_pInbuffer, Vect3D_t &f_V3); + bool ParseTriangle(const char *f_pInbuffer, Triangle_t &f_triangle); +}; + +#endif //C_3DOBJECT_HEADER_FILE + diff --git a/matchblox/engine/C_Block.cpp b/matchblox/engine/C_Block.cpp new file mode 100644 index 0000000..4c092a2 --- /dev/null +++ b/matchblox/engine/C_Block.cpp @@ -0,0 +1,71 @@ +#include + +#include + +#include "C_Block.h" + +#define FADE_DURATION 500 + +/*Durations of animations*/ +unsigned int g_BlockAnimDurations[4] = {0, 500, 500, 500}; + +C_Block::C_Block(const char* f_strFileName, + GLuint f_uiColorTex , + MatProps_t f_Mat) +: C_3DObject(f_strFileName, f_uiColorTex, f_Mat), + m_CurrState(BS_IDLE), m_uiAnimStart(0) +{ + +} + +C_Block::~C_Block() +{ + +} + +void C_Block::Render(unsigned int f_iElapsedTime) +{ + unsigned int l_uiDeltaTime = f_iElapsedTime - m_uiAnimStart; + double l_Scale = 0.0; + + + //check if the previous animation has ended in between + //calls to this Render function. + if (l_uiDeltaTime > g_BlockAnimDurations[(int)m_CurrState]) + { + m_CurrState = BS_IDLE; + } + + glPushMatrix(); + + switch (m_CurrState) + { + case BS_FADE_IN: + l_Scale = (double)l_uiDeltaTime / (double)g_BlockAnimDurations[BS_FADE_IN]; + //glScaled(l_Scale, l_Scale, l_Scale); + SetScale(l_Scale, l_Scale, l_Scale); + TransRotateScale(); + C_3DObject::Render(); + break; + + case BS_FADE_OUT: + l_Scale = 1.0 - ((double)l_uiDeltaTime / (double)g_BlockAnimDurations[BS_FADE_OUT]); +// glScaled(l_Scale, l_Scale, l_Scale); + SetScale(l_Scale, l_Scale, l_Scale); + TransRotateScale(); + C_3DObject::Render(); + break; + + case BS_COLLIDE: + break; + + case BS_IDLE: + default: + TransRotateScale(); + C_3DObject::Render(); + break; + } + + glPopMatrix(); + +} diff --git a/matchblox/engine/C_Block.h b/matchblox/engine/C_Block.h new file mode 100644 index 0000000..f0e03b7 --- /dev/null +++ b/matchblox/engine/C_Block.h @@ -0,0 +1,33 @@ +#ifndef C_BLOCK_HEADER_FILE + +#define C_BLOCK_HEADER_FILE + +#include "C_3DObject.h" + +typedef enum BlockAnimState +{ + BS_IDLE = 0, + BS_FADE_IN = 1, + BS_FADE_OUT = 2, + BS_COLLIDE = 3 +}; + + +class C_Block : public C_3DObject +{ +public: + C_Block(const char* f_strFileName, + GLuint f_uiColorTex , + MatProps_t f_Mat); + ~C_Block(); + + void Render(unsigned int f_iElapsedTime); + inline void SetState(BlockAnimState f_State, unsigned int f_uiElapsedTime) { m_CurrState = f_State; m_uiAnimStart = f_uiElapsedTime; } + +private: + BlockAnimState m_CurrState; + unsigned int m_uiAnimStart; +}; + +#endif //C_BLOCK_HEADER_FILE + diff --git a/matchblox/engine/C_Box.cpp b/matchblox/engine/C_Box.cpp new file mode 100644 index 0000000..9bde3ff --- /dev/null +++ b/matchblox/engine/C_Box.cpp @@ -0,0 +1,111 @@ +#include +#include + +#include "C_Box.h" +#include "typedefs.h" + +C_Box::C_Box(const char *f_strFileName, + GLuint f_uiTexture, + MatProps_t f_Mat, + int f_iTilesX, int f_iTilesY, + C_3DObject *f_pTiles[5]) +: C_3DObject(f_strFileName, f_uiTexture, f_Mat), + m_pTiles(f_pTiles), m_iTilesX(f_iTilesX), + m_iTilesY(f_iTilesY) +{ + m_iNumTiles = m_iTilesX * m_iTilesY; + //create a new tiles layout array + m_iTilesLayout = new int[m_iNumTiles]; + + //calculate the tile size (this should be the same + //for all tile types) + BoundingBox_t l_BBox = m_pTiles[0]->GetBoundingBox(); + m_dTileSize = l_BBox.m_dRight - l_BBox.m_dLeft; + + //calculate the lower left tile position (in xz plane) + m_LowLeftTilePos = Vect3D_t(-m_dTileSize * (double)(m_iTilesX-1)/2.0, + 0.0, + m_dTileSize * (double)(m_iTilesY-1)/2.0); +} + +C_Box::~C_Box() +{ + delete [] m_iTilesLayout; +} + +void C_Box::RandomizeTiles() +{ + int l_iNumTiles = m_iTilesX * m_iTilesY; + + //first set the layout to all tiles with no hole + for (int i=0; iSetPos(m_LowLeftTilePos.x + (double)col * m_dTileSize, + 0.0, + m_LowLeftTilePos.z - (double)row * m_dTileSize); + } +} + +void C_Box::Render() +{ + // + glPushMatrix(); + + //apply transformation for box + TransRotateScale(); + + //render the box + C_3DObject::Render(); + + + //render the tiles + for(int x=0; x= 0 && l_iTileIndex <= 3) + { + //tile with a hole + glPushMatrix(); + m_pTiles[l_iTileIndex]->TransRotateScale(); + m_pTiles[l_iTileIndex]->Render(); + glPopMatrix(); + } + else + { + //tile without a hole + //set the position + m_pTiles[4]->SetPos(m_LowLeftTilePos.x + (double)x * m_dTileSize, + 0.0, + m_LowLeftTilePos.z - (double)y * m_dTileSize); + glPushMatrix(); + m_pTiles[4]->TransRotateScale(); + m_pTiles[4]->Render(); + glPopMatrix(); + } + } + + glPopMatrix(); +} + diff --git a/matchblox/engine/C_Box.h b/matchblox/engine/C_Box.h new file mode 100644 index 0000000..ed8c133 --- /dev/null +++ b/matchblox/engine/C_Box.h @@ -0,0 +1,35 @@ +#ifndef C_BOX_HEADER_FILE + +#define C_BOX_HEADER_FILE + +#include +#include "C_3DObject.h" + +class C_Box : public C_3DObject +{ +public: + C_Box(const char *f_strFileName, + GLuint f_uiTexture, + MatProps_t f_Mat, + int f_iTilesX, int f_iTilesY, + C_3DObject *f_pTiles[5]); + + ~C_Box(); + + void RandomizeTiles(); + void Render(); + +private: + C_3DObject **m_pTiles; //the tile objects for the top face of the box (holes) + int m_iTilesX, //number of tiles in x direction + m_iTilesY, //number of tiles in y direction + m_iNumTiles; //total number of tiles + double m_dTileSize; //the width and height of a tile + Vect3D_t m_LowLeftTilePos; //center position of the lower leftmost + //tile (relative to the box its position) + + int *m_iTilesLayout; //the indices of the tile objects +}; + +#endif //C_BOX_HEADER_FILE + diff --git a/matchblox/engine/C_Environment.cpp b/matchblox/engine/C_Environment.cpp new file mode 100644 index 0000000..0c7cbfd --- /dev/null +++ b/matchblox/engine/C_Environment.cpp @@ -0,0 +1,119 @@ +#include +#include +#include + +#include "bitmap.h" +#include "C_Environment.h" + +#ifndef GL_CLAMP_TO_EDGE +#define GL_CLAMP_TO_EDGE 0x812F +#endif //GL_CLAMP_TO_EDGE + +using namespace std; + +C_Environment::C_Environment(const char *f_strEnvMapBaseName, + double f_dDistance) + : m_dDist(f_dDistance) +{ + string l_strBase = f_strEnvMapBaseName, + l_strFilename; + const char *l_suffix[] = { "negative_x.bmp", + "negative_y.bmp", + "negative_z.bmp", + "positive_x.bmp", + "positive_y.bmp", + "positive_z.bmp" + }; + + BitmapStruct l_bmp; + + //load textures + for (int i=0; i<6; i++) + { + l_strFilename = l_strBase + l_suffix[i]; + l_bmp = BitmapLoad((char*)l_strFilename.c_str()); + m_uiFaceTex[i] = (GLuint)l_bmp.m_iImageId; + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + + } +} + +C_Environment::~C_Environment() +{ + glDeleteTextures(6, m_uiFaceTex); +} + +void C_Environment::Render() +{ + double l_Vertices[8][3] = + { { -m_dDist, -m_dDist, m_dDist }, + { m_dDist, -m_dDist, m_dDist }, + { m_dDist, -m_dDist, -m_dDist }, + { -m_dDist, -m_dDist, -m_dDist }, + { -m_dDist, m_dDist, m_dDist }, + { m_dDist, m_dDist, m_dDist }, + { m_dDist, m_dDist, -m_dDist }, + { -m_dDist, m_dDist, -m_dDist } }; + + + //init render settings for rendering of the environment + //mapped cube + + glPushAttrib(GL_TEXTURE_BIT | GL_ENABLE_BIT); + + //no lighting + glDisable(GL_LIGHTING); + //enable texturing + glEnable(GL_TEXTURE_2D); + glTexEnvf(GL_TEXTURE_2D, GL_TEXTURE_ENV_MODE, GL_REPLACE); + //neg x (left) + glBindTexture(GL_TEXTURE_2D, m_uiFaceTex[0]); + RenderFace(l_Vertices, 3, 0, 4, 7); + + //neg y (down) + glBindTexture(GL_TEXTURE_2D, m_uiFaceTex[1]); + RenderFace(l_Vertices, 3, 2, 1, 0); + + //nez z (front) + glBindTexture(GL_TEXTURE_2D, m_uiFaceTex[2]); + RenderFace(l_Vertices, 2, 3, 7, 6); + + //pos x (right) + glBindTexture(GL_TEXTURE_2D, m_uiFaceTex[3]); + RenderFace(l_Vertices, 1, 2, 6, 5); + + //pos y (top) + glBindTexture(GL_TEXTURE_2D, m_uiFaceTex[4]); + RenderFace(l_Vertices, 4, 5, 6, 7); + + //pos z (back) + glBindTexture(GL_TEXTURE_2D, m_uiFaceTex[5]); + RenderFace(l_Vertices, 0, 1, 5, 4); + + glPopAttrib(); +} + +void C_Environment::RenderFace(double f_verts[8][3], + int f_v00, int f_v10, + int f_v11, int f_v01) +{ + //render textured quad in counter clockwise order + glBegin(GL_QUADS); + glTexCoord2i(0,0); + glVertex3dv(f_verts[f_v00]); + + glTexCoord2i(1,0); + glVertex3dv(f_verts[f_v10]); + + glTexCoord2i(1,1); + glVertex3dv(f_verts[f_v11]); + + glTexCoord2i(0,1); + glVertex3dv(f_verts[f_v01]); + glEnd(); + +} diff --git a/matchblox/engine/C_Environment.h b/matchblox/engine/C_Environment.h new file mode 100644 index 0000000..cfdb816 --- /dev/null +++ b/matchblox/engine/C_Environment.h @@ -0,0 +1,32 @@ +#ifndef C_ENVIRONMENT_H + +#define C_ENVIRONMENT_H + +#include + +class C_Environment +{ +public: + //environment map consist of 6 bitmaps with a common + //base name with the axis name (_positive_x.bmp, + //_negative_y.bmp, ...) + //appended, the distance is the distance from the center + //to the sides of the cube + C_Environment(const char *f_strEnvMapBaseName, + double f_dDistance); + ~C_Environment(); + + void Render(); + void RenderFace(double f_verts[8][3], + int f_v00, int f_v10, + int f_v11, int f_v01); + +private: + double m_dDist; + + //texture handles for the faces of the cube + GLuint m_uiFaceTex[6]; //order -x, -y, -z, +x, +y, +z +}; + +#endif //C_ENVIRONMENT_H + diff --git a/matchblox/engine/C_Hand.cpp b/matchblox/engine/C_Hand.cpp new file mode 100644 index 0000000..8c4d977 --- /dev/null +++ b/matchblox/engine/C_Hand.cpp @@ -0,0 +1,43 @@ +#include +#include "C_Hand.h" + +#define FADE_DURATION 500 + +//duration of animations in ms +unsigned int g_HandAnimDurations[3] = {0, 100, 100}; + + +C_Hand::C_Hand(const char* f_strFileName, GLuint f_uiTex, + MatProps_t f_Mat) +: C_3DObject(f_strFileName, f_uiTex, f_Mat), + m_CurrState(HS_IDLE), m_uiAnimStart(0) +{ +} + + +void C_Hand::Render(unsigned int f_iElapsedTime) +{ + unsigned int l_uiDeltaTime = f_iElapsedTime - m_uiAnimStart; + + if (l_uiDeltaTime > g_HandAnimDurations[(int)m_CurrState]) + { + m_CurrState = HS_IDLE; + } + + switch (m_CurrState) + { + case HS_GRAB: + C_3DObject::Render(); + break; + + case HS_RELEASE: + C_3DObject::Render(); + break; + + case HS_IDLE: + default: + C_3DObject::Render(); + break; + } + +} diff --git a/matchblox/engine/C_Hand.h b/matchblox/engine/C_Hand.h new file mode 100644 index 0000000..3ada63d --- /dev/null +++ b/matchblox/engine/C_Hand.h @@ -0,0 +1,33 @@ +#ifndef C_HAND_HEADER_FILE + +#define C_HAND_HEADER_FILE + +#include "C_3DObject.h" +#include "typedefs.h" + +typedef enum HandAnimState +{ + HS_IDLE = 0, + HS_GRAB = 1, + HS_RELEASE = 2, + HS_COLLIDE = 3 +}; + + +class C_Hand : public C_3DObject +{ +public: + C_Hand(const char* f_strFileName, GLuint f_uiTex, + MatProps_t f_Mat); + ~C_Hand(); + + void Render(unsigned int f_iElapsedTime); + inline void SetState(HandAnimState f_State, unsigned int f_uiElapsedTime) { m_CurrState = f_State; m_uiAnimStart = f_uiElapsedTime; } + +private: + HandAnimState m_CurrState; + unsigned int m_uiAnimStart; +}; + +#endif //C_HAND_HEADER_FILE + diff --git a/matchblox/engine/C_Log.cpp b/matchblox/engine/C_Log.cpp new file mode 100644 index 0000000..d9a1154 --- /dev/null +++ b/matchblox/engine/C_Log.cpp @@ -0,0 +1,24 @@ +#include "C_Log.h" + +C_Log::C_Log(char *f_strFileName) +{ +} + +C_Log::~C_Log() +{ +} + +bool C_Log::LogNewSession(int f_iUserID, int f_iGameID) +{ + return true; +} + +bool C_Log::LogSessionTurn(int f_iUserID, int f_iGameID, int f_iBlockNr, int HolePos, unsigned int f_uiTime) +{ + return true; +} + +bool C_Log::LogSessionTotals(int f_iUserID, int f_iGameID, unsigned int f_uiTotalTime) +{ + return true; +} diff --git a/matchblox/engine/C_Log.h b/matchblox/engine/C_Log.h new file mode 100644 index 0000000..2b598dd --- /dev/null +++ b/matchblox/engine/C_Log.h @@ -0,0 +1,20 @@ +#ifndef C_LOG_HEADER_FILE + +#define C_LOG_HEADER_FILE + +class C_Log +{ +public: + C_Log(char *f_strFileName); + ~C_Log(); + + bool LogNewSession(int f_iUserID, int f_iGameID); + bool LogSessionTurn(int f_iUserID, int f_iGameID, int f_iBlockNr, int HolePos, unsigned int f_uiTime); + bool LogSessionTotals(int f_iUserID, int f_iGameID, unsigned int f_uiTotalTime); + +private: +// FILE *m_pLogFile; +}; + +#endif //C_LOG_HEADER_FILE + diff --git a/matchblox/engine/C_MatchBloxEngine.cpp b/matchblox/engine/C_MatchBloxEngine.cpp new file mode 100644 index 0000000..7e17b1b --- /dev/null +++ b/matchblox/engine/C_MatchBloxEngine.cpp @@ -0,0 +1,348 @@ +#include + +#include +#include +#include + +#include "C_MatchBloxEngine.h" + +#include "C_3DObject.h" +#include "C_Environment.h" +#include "C_Hand.h" +#include "C_Block.h" +#include "C_Box.h" +#include "C_Log.h" +#include "bitmap.h" + +C_MatchBloxEngine::C_MatchBloxEngine(const char *f_strModelPath, + const char *f_strLogFile) +{ + //create logger + + + //Load models + if (LoadModels(f_strModelPath)) + { + //set state to initialised; + m_State = ES_INITIALISED; + } + else + { + m_State = ES_ERROR; + } + + //initialise a random seed + srand ( time(NULL) ); + + //init vars + m_CurrentBox = BS_SMALL; + + //debug + m_pBox[0]->SetPos(0.0, -5.0, -15.0); + m_pBox[0]->SetRot(45.0, 0.0, 0.0); + m_pBox[0]->RandomizeTiles(); + + m_pBlock[0]->SetPos(-6.0, 1.0, -10.0); + m_pBlock[0]->SetRot(90.0, 0.0, 0.0); + m_pBlock[1]->SetPos(-2.0, 1.0, -10.0); + m_pBlock[1]->SetRot(90.0, 0.0, 0.0); + m_pBlock[2]->SetPos(2.0, 1.0, -10.0); + m_pBlock[2]->SetRot(90.0, 0.0, 0.0); + m_pBlock[3]->SetPos(6.0, 1.0, -10.0); + m_pBlock[3]->SetRot(90.0, 0.0, 0.0); +} + +C_MatchBloxEngine::~C_MatchBloxEngine() +{ + //destroy logger + + //delete models + DeleteModels(); +} + +GameResult C_MatchBloxEngine::GameStep(msgQueue &f_Queue) +{ + //process message queue + return GR_ERROR; +} + +void C_MatchBloxEngine::Render_Basics(unsigned int f_uiElapsedTime) +{ + //render the environment + m_pEnvMap->Render(); + + m_pBox[(intptr_t)m_CurrentBox]->Render(); + for (int i=0; i<4; i++) + m_pBlock[i]->Render(f_uiElapsedTime); +// m_pHand->Render(f_uiElapsedTime); +} + +void C_MatchBloxEngine::Render(unsigned int f_uiElapsedTime) +{ + switch (m_State) + { + case ES_INITIALISED: + Render_Basics(f_uiElapsedTime); + break; + + case ES_ERROR: + //render a red cube + glPushMatrix(); + glPushAttrib(GL_ENABLE_BIT); + glDisable(GL_LIGHTING); + glColor3d(1.0, 0.0, 0.0); + glTranslated(0.0, 0.0, -5.0); + glutSolidCube(5.0); + glPopAttrib(); + glPopMatrix(); + break; + + case ES_GET_READY: + Render_Basics(f_uiElapsedTime); + //render some GET READY text + break; + + case ES_PLAYING_GRAB_BLOCK: + Render_Basics(f_uiElapsedTime); + break; + + case ES_PLAYING_PUT_BLOCK: + Render_Basics(f_uiElapsedTime); + break; + + case ES_PAUSED: + Render_Basics(f_uiElapsedTime); + //render menu?? + break; + + case ES_FINISHED: + //render results... + break; + } + + //glPushMatrix(); + + //double l_dSeconds = (double)f_uiElapsedTime/1000.0; + + //glRotated(l_dSeconds * 5.0, 0.0, 1.0, 0.0); + ////glRotated(l_dSeconds * 10, 0.0, 0.0, 1.0); + + //m_pEnvMap->Render(); + + //glPopMatrix(); + + //m_pBox[0]->Render(); + + //for(int i=0; i<4; i++) + //{ + // glPushMatrix(); + // m_pBlock[i]->Render(f_uiElapsedTime); + // glPopMatrix(); + //} + +} + +bool C_MatchBloxEngine::NewGame(int f_iUserID, int f_iGameId, BoxSize f_BS) +{ + if(m_State == ES_INITIALISED) + { + //log new game + + //prepare a fresh box + m_CurrentBox = f_BS; + m_pBox[(int)m_CurrentBox]->RandomizeTiles(); + + //set state to GET READY + m_State = ES_GET_READY; + + //init object positions + m_pBox[(int)m_CurrentBox]->SetPos(0.0, -6.0, -15.0); + return true; + } + + return false; +} + +bool C_MatchBloxEngine::StartGame() +{ + return false; +} + +bool C_MatchBloxEngine::Pause() +{ + //only pause when playing + if (m_State == ES_PLAYING_GRAB_BLOCK || + m_State == ES_PLAYING_PUT_BLOCK) + { + //save current state + m_SavedState = m_State; + + //probably do something with a time variable + + //set current state to paused + m_State = ES_PAUSED; + + return true; + } + + return false; +} + +bool C_MatchBloxEngine::Resume() +{ + if (m_State == ES_PAUSED) + { + //restore previous state + m_State = m_SavedState; + + //restore timers + // + + return true; + } + return false; +} + +bool C_MatchBloxEngine::Abort() +{ + //abort when not in error or init state + if (m_State != ES_ERROR && m_State != ES_INITIALISED) + { + //set state to initialised + m_State = ES_INITIALISED; + + //.. + + return true; + } + return false; +} + +bool C_MatchBloxEngine::LoadModels(const char* f_strModelDir) +{ + MatProps_t l_Mat; + std::string l_BaseName = f_strModelDir; + + //create the environment mapped cube + m_pEnvMap = new C_Environment("envmaps/terrain_", 50.0); + + //load the bitmaps for the textures + LoadTexture((l_BaseName + "/wood1.bmp").c_str(), m_uiWood1Tex); + LoadTexture((l_BaseName + "/wood2.bmp").c_str(), m_uiWood2Tex); + LoadTexture((l_BaseName + "/wood3.bmp").c_str(), m_uiWood3Tex); + + //load the block models + //red squares + l_Mat.setAmb(1.0, 0.0, 0.0, 1.0); + l_Mat.setDif(1.0, 0.0, 0.0, 1.0); + m_pBlock[BT_SQUARE] = new C_Block((l_BaseName + "/square.obj").c_str(), + m_uiWood1Tex, l_Mat); + if (!m_pBlock[BT_SQUARE]->Initialized()) return false; + + //yellow cricles + l_Mat.setAmb(0.0, 1.0, 1.0, 1.0); + l_Mat.setDif(0.0, 1.0, 1.0, 1.0); + m_pBlock[BT_CIRCLE] = new C_Block((l_BaseName + "/circle.obj").c_str(), + m_uiWood1Tex, l_Mat); + if (!m_pBlock[BT_CIRCLE]->Initialized()) return false; + + //green triangles + l_Mat.setAmb(0.0, 1.0, 0.0, 1.0); + l_Mat.setDif(0.0, 1.0, 0.0, 1.0); + m_pBlock[BT_TRIANGLE] = new C_Block((l_BaseName + "/triangle.obj").c_str(), + m_uiWood1Tex, l_Mat); + if (!m_pBlock[BT_TRIANGLE]->Initialized()) return false; + + //blue crosses + l_Mat.setAmb(0.0, 0.0, 1.0, 1.0); + l_Mat.setDif(0.0, 0.0, 1.0, 1.0); + m_pBlock[BT_CROSS] = new C_Block((l_BaseName + "/cross.obj").c_str(), + m_uiWood1Tex, l_Mat); + if (!m_pBlock[BT_CROSS]->Initialized()) return false; + + + //load the hand??? + + + //Load the box tiles + l_Mat.setAmb(1.0, 1.0, 1.0, 1.0); + l_Mat.setDif(1.0, 1.0, 1.0, 1.0); + + m_pTiles[BT_SQUARE] = new C_3DObject((l_BaseName + "/tile_square.obj").c_str(), + m_uiWood3Tex, l_Mat); + if (!m_pTiles[BT_SQUARE]->Initialized()) return false; + + m_pTiles[BT_CIRCLE] = new C_3DObject((l_BaseName + "/tile_circle.obj").c_str(), + m_uiWood3Tex, l_Mat); + if (!m_pTiles[BT_CIRCLE]->Initialized()) return false; + + m_pTiles[BT_TRIANGLE] = new C_3DObject((l_BaseName + "/tile_triangle.obj").c_str(), + m_uiWood3Tex, l_Mat); + if (!m_pTiles[BT_TRIANGLE]->Initialized()) return false; + + m_pTiles[BT_CROSS] = new C_3DObject((l_BaseName + "/tile_cross.obj").c_str(), + m_uiWood3Tex, l_Mat); + if (!m_pTiles[BT_CROSS]->Initialized()) return false; + + m_pTiles[4] = new C_3DObject((l_BaseName + "/tile_no_hole.obj").c_str(), + m_uiWood3Tex, l_Mat); + if (!m_pTiles[4]->Initialized()) return false; + + + //Load the box models + m_pBox[0] = new C_Box((l_BaseName + "/box_small.obj").c_str(), + m_uiWood2Tex, l_Mat, 2, 2, m_pTiles); + if (!m_pBox[0]->Initialized()) return false; + + m_pBox[1] = new C_Box((l_BaseName + "/box_med.obj").c_str(), + m_uiWood2Tex, l_Mat, 4, 2, m_pTiles); + if (!m_pBox[1]->Initialized()) return false; + + m_pBox[2] = new C_Box((l_BaseName + "/box_large.obj").c_str(), + m_uiWood2Tex, l_Mat, 4, 4, m_pTiles); + if (!m_pBox[2]->Initialized()) return false; + + + return true; +} + +void C_MatchBloxEngine::DeleteModels() +{ + //delete objects + delete m_pEnvMap; + delete m_pBlock[0]; + delete m_pBlock[1]; + delete m_pBlock[2]; + delete m_pBlock[3]; + //delete m_pHand; + delete m_pBox[0]; + delete m_pBox[1]; + delete m_pBox[2]; + delete m_pTiles[0]; + delete m_pTiles[1]; + delete m_pTiles[2]; + delete m_pTiles[3]; + delete m_pTiles[4]; + + //delete textures + glDeleteTextures(1, &m_uiWood1Tex); + glDeleteTextures(1, &m_uiWood2Tex); + glDeleteTextures(1, &m_uiWood3Tex); +} + +void C_MatchBloxEngine::LoadTexture(const char* f_BmpName, GLuint &f_uiTexHandle) +{ + BitmapStruct l_Bmp; + + l_Bmp = BitmapLoad((char*)f_BmpName); + f_uiTexHandle = (GLuint)l_Bmp.m_iImageId; + + glBindTexture(GL_TEXTURE_2D, f_uiTexHandle); + + //set the texture paramaters + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); +} + diff --git a/matchblox/engine/C_MatchBloxEngine.h b/matchblox/engine/C_MatchBloxEngine.h new file mode 100644 index 0000000..97aa892 --- /dev/null +++ b/matchblox/engine/C_MatchBloxEngine.h @@ -0,0 +1,87 @@ +#ifndef C_MATCHBLOXENGINE_HEADER_FILE + +#define C_MATCHBLOXENGINE_HEADER_FILE + +#include "MessageQueue.h" + +class C_3DObject; +class C_Block; +class C_Hand; +class C_Log; +class C_Environment; +class C_Box; + +typedef enum GameResult +{ + GR_FINISHED, + GR_BUSY, + GR_ERROR +} GameResult; + +enum EngineState +{ + ES_INITIALISED, + ES_ERROR, + ES_GET_READY, //game initialised, waiting for start signal from player + ES_PLAYING_GRAB_BLOCK, //no block in hand -> grab floating block + ES_PLAYING_PUT_BLOCK, //block in hand -> put block in box + ES_PAUSED, //pause... + ES_FINISHED //finished -> show score and goto init +}; + +enum BlockType +{ + BT_SQUARE = 0, + BT_CIRCLE = 1, + BT_TRIANGLE = 2, + BT_CROSS = 3 +}; + +enum BoxSize +{ + BS_SMALL = 0, + BS_MED = 1, + BS_LARGE = 2 +}; + + +class C_MatchBloxEngine +{ +public: + C_MatchBloxEngine(const char *f_strModelPath, + const char *f_strLogFile); + ~C_MatchBloxEngine(); + + GameResult GameStep(msgQueue &f_Queue); + void Render(unsigned int f_uiElapsedTime); + + bool NewGame(int f_iUserID, int f_iGameId, BoxSize f_BS); + bool StartGame(); + bool Pause(); + bool Resume(); + bool Abort(); + +private: + C_Environment *m_pEnvMap; + C_Block *m_pBlock[4]; + C_Hand *m_pHand; + C_3DObject *m_pTiles[5]; + C_Box *m_pBox[3]; + C_Log *m_pLog; + + GLuint m_uiWood1Tex, + m_uiWood2Tex, + m_uiWood3Tex; + + EngineState m_State, m_SavedState; + BoxSize m_CurrentBox; + + void Render_Basics(unsigned int f_uiElapsedTime); + + bool LoadModels(const char* f_strModelDir); + void DeleteModels(); + void LoadTexture(const char* f_BmpName, GLuint &f_uiTexHandle); +}; + +#endif //C_MATCHBLOXENGINE_HEADER_FILE + diff --git a/matchblox/engine/MessageQueue.h b/matchblox/engine/MessageQueue.h new file mode 100644 index 0000000..47a061e --- /dev/null +++ b/matchblox/engine/MessageQueue.h @@ -0,0 +1,26 @@ +#ifndef MESSAGEQUEUE_HEADER_FILE + +#define MESSAGEQUEUE_HEADER_FILE + +#include + +typedef enum msgType +{ + MOUSE_MOVE, + MOUSE_PRESS, + KEY_PRESS, + SPECIAL_KEY, + WII_CURSOR_MOVE, + WII_BUTTON_PRESS +}; + +typedef struct message +{ + msgType m_MessageType; + int parm1, parm2, parm3, parm4; +} msgStruct; + +typedef std::queue msgQueue; + +#endif //MESSAGEQUEUE_HEADER_FILE + diff --git a/matchblox/engine/typedefs.h b/matchblox/engine/typedefs.h new file mode 100644 index 0000000..0262c14 --- /dev/null +++ b/matchblox/engine/typedefs.h @@ -0,0 +1,128 @@ +#ifndef TYPEDEFS_H + +#define TYPEDEFS_H + +#include +#include + +typedef struct bb +{ + bb() { + //init a bounding box with the min values set to max double and visa versa + m_dLeft = m_dBottom = m_dFront = std::numeric_limits::max(); + m_dRight = m_dTop = m_dBack = -std::numeric_limits::max(); + } + + double m_dLeft, //min x + m_dBottom, //min y + m_dFront, //min z + m_dRight, //max x + m_dTop, //max y + m_dBack; //max z + +} BoundingBox_t; + +typedef struct vec3d +{ + double x, y, z; + + //constructors + vec3d() + { x=0.0, y=0.0, z=0.0; } + vec3d(double fx, double fy, double fz) + { x=fx, y=fy, z=fz; } + vec3d(const vec3d &clone) + { x=clone.x; y=clone.y; z=clone.z; } + + inline vec3d& operator=(const vec3d &rhs) + { x=rhs.x; y=rhs.y; z=rhs.z; return *this; } + inline vec3d& operator+=(const vec3d &rhs) + { x+=rhs.x; y+=rhs.y; z+=rhs.z; return *this; } + inline vec3d& operator-=(const vec3d &rhs) + { x-=rhs.x; y-=rhs.y; z-=rhs.z; return *this; } + inline vec3d& operator*=(const vec3d &rhs) + { x*=rhs.x; y*=rhs.y; z*=rhs.z; return *this; } + inline vec3d& operator*=(const double &scal) + { x*=scal; y*=scal; z*=scal; return *this; } + + inline const vec3d& operator+(const vec3d &rhs) + { return vec3d(*this) += rhs; } + inline const vec3d& operator-(const vec3d &rhs) + { return vec3d(*this) -= rhs; } + inline const vec3d& operator*(const vec3d &rhs) + { return vec3d(*this) *= rhs; } + inline const vec3d& operator*(const double &scal) + { return vec3d(*this) *= scal; } +} Vect3D_t; + + + +inline void UpdBBox(BoundingBox_t &B, Vect3D_t &V) +{ + if (V.x < B.m_dLeft) + B.m_dLeft = V.x; + else if (V.x > B.m_dRight) + B.m_dRight = V.x; + if (V.y < B.m_dBottom) + B.m_dBottom = V.y; + else if (V.y > B.m_dTop) + B.m_dTop = V.y; + if (V.z < B.m_dFront) + B.m_dFront = V.z; + else if (V.z > B.m_dBack) + B.m_dBack = V.z; +}; + +typedef struct triangle +{ + int v1, n1, t1, + v2, n2, t2, + v3, n3, t3; +} Triangle_t; + +typedef struct mat +{ + GLfloat m_fAmb[4], + m_fDif[4], + m_fSpec[4], + m_fEmi[4], + m_fShin; + + //default constructor + mat() + { + m_fAmb[0] = m_fAmb[1] = m_fAmb[2] = 0.7f; m_fAmb[3] = 1.0f; + m_fDif[0] = m_fDif[1] = m_fDif[3] = 0.7f; m_fDif[3] = 1.0f; + m_fSpec[0] = m_fSpec[1] = m_fSpec[2] = m_fSpec[3] = 1.0f; + m_fEmi[0] = m_fEmi[1] = m_fEmi[2] = 0.0f; m_fEmi[3] = 1.0f; + m_fShin = 128.0f; + } + //for convenience + inline void setAmb(float r, float g, float b, float a) + { m_fAmb[0] = r; m_fAmb[1] = g; m_fAmb[2] = b; m_fAmb[3] = a; } + inline void setDif(float r, float g, float b, float a) + { m_fDif[0] = r; m_fDif[1] = g; m_fDif[2] = b; m_fDif[3] = a; } + inline void setSpec(float r, float g, float b, float a) + { m_fSpec[0] = r; m_fSpec[1] = g; m_fSpec[2] = b; m_fSpec[3] = a; } + inline void setEmi(float r, float g, float b, float a) + { m_fEmi[0] = r; m_fEmi[1] = g; m_fEmi[2] = b; m_fEmi[3] = a; } + +} MatProps_t; +/* +typedef struct facegroup +{ + MatProps_t m_material; + std::vector m_faces; +} FaceGroup_t; +*/ + +typedef struct geom +{ + std::vector m_verts, + m_norms, + m_texs; + std::vector m_triangles; +} Geometry_t; + +#endif //TYPEDEFS_H + diff --git a/matchblox/main.cpp b/matchblox/main.cpp new file mode 100644 index 0000000..dc4ec64 --- /dev/null +++ b/matchblox/main.cpp @@ -0,0 +1,158 @@ +#include +#include + +#include "MessageQueue.h" +#include "C_MatchBloxEngine.h" + +#define SCREEN_WIDTH 640 +#define SCREEN_HEIGHT 480 + +msgQueue g_Queue; +C_MatchBloxEngine *g_pEngine; + +void init_gl(void) +{ + GLfloat l_fLightpos[4] = {0.0, 1.0, 1.0, 0.0}; + glClearColor(0.9, 0.9, 0.9, 1.0); + glClearDepth(1000.0); + glShadeModel(GL_SMOOTH); + glEnable(GL_DEPTH_TEST); + glEnable(GL_LIGHTING); + glEnable(GL_LIGHT0); + glLightfv(GL_LIGHT0, GL_POSITION, l_fLightpos); + glEnable(GL_NORMALIZE); + + glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE); +} // init_gl + +void idle_func(void) +{ + //call engine idle func + + glutPostRedisplay(); +} + +void render_scene(void) +{ + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + g_pEngine->Render(glutGet(GLUT_ELAPSED_TIME)); + + glutSwapBuffers(); + +} // render_scene + +void reshape(int w, int h) +{ + //set the new viewport dimension + glViewport(0, 0, w, h); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + gluPerspective(90.0, ((GLdouble)h)/((GLdouble)w), 0.5, 100.0); + glTranslated(0.0, 0.0, -0.5); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); +} + +void process_normal_keys(unsigned char key, int x, int y) +{ + // escape + if (key == 27) + { + exit(0); + } + else + { + if (key == 'n') + { + g_pEngine->Abort(); + g_pEngine->NewGame(0, 0, BS_LARGE); + } + msgStruct l_msg; + l_msg.m_MessageType = KEY_PRESS; + l_msg.parm1 = key; + l_msg.parm2 = x; + l_msg.parm3 = y; + + g_Queue.push(l_msg); + } +} // process_normal_keys + + + +void process_special_keys(int key, int x, int y) +{ + switch (key) + { + // do sumting + } + msgStruct l_msg; + l_msg.m_MessageType = SPECIAL_KEY; + l_msg.parm1 = key; + l_msg.parm2 = x; + l_msg.parm3 = y; + + g_Queue.push(l_msg); + +} // process_special_keys + + + +void process_mouse(int button, int state, int x, int y) +{ + msgStruct l_msg; + l_msg.m_MessageType = MOUSE_PRESS; + l_msg.parm1 = button; + l_msg.parm2 = state; + l_msg.parm3 = x; + l_msg.parm4 = y; + + g_Queue.push(l_msg); + + +} // process_mouse + + + +void process_passive_mouse(int x, int y) +{ + //process_mouse(-1, -1, x, y); + msgStruct l_msg; + l_msg.m_MessageType = MOUSE_MOVE; + l_msg.parm1 = x; + l_msg.parm2 = y; + l_msg.parm3 = 0; + l_msg.parm4 = 0; + + g_Queue.push(l_msg); + +} // process_passive_mouse + + + +int main(int argc, char **argv) +{ + glutInit(&argc, argv); + glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); + glutInitWindowSize(SCREEN_WIDTH, SCREEN_HEIGHT); + glutCreateWindow("MatchBloxEngine demo"); + + glutReshapeFunc(reshape); + glutDisplayFunc(render_scene); + glutIdleFunc(idle_func); + glutKeyboardFunc(process_normal_keys); + glutSpecialFunc(process_special_keys); + glutMouseFunc(process_mouse); + glutPassiveMotionFunc(process_passive_mouse); + + init_gl(); + //MenuInit(SCREEN_WIDTH, SCREEN_HEIGHT); + + g_pEngine = new C_MatchBloxEngine("models", ""); + + glutMainLoop(); + + return 0; + +} // main + diff --git a/matchblox/matchblox.anjuta b/matchblox/matchblox.anjuta deleted file mode 100644 index 51ddd65..0000000 --- a/matchblox/matchblox.anjuta +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/matchblox/matchblox.vcproj b/matchblox/matchblox.vcproj new file mode 100644 index 0000000..0f7ecc0 --- /dev/null +++ b/matchblox/matchblox.vcproj @@ -0,0 +1,277 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/matchblox/menu/button.c b/matchblox/menu/button.c new file mode 100644 index 0000000..d452fd0 --- /dev/null +++ b/matchblox/menu/button.c @@ -0,0 +1,328 @@ +#ifdef G_OS_WIN32 + #define WIN32_LEAN_AND_MEAN 1 + #include +#else + #define FALSE 0 + #define TRUE !FALSE + #define max(a, b) (((a) > (b)) ? (a) : (b)) + +#endif + +#include + +#include +#include +#include +#include + +#include "button.h" +#include "font.h" + + +struct ButtonStruct ButtonCreate(int f_iXPos, int f_iYPos, int f_iWidth, int f_iHeight, char *f_pcTitle, int f_iType, int f_iGroup, int f_iId) +{ + struct ButtonStruct l_sButton; + + // copy parameters + l_sButton.m_iXPos = f_iXPos; + l_sButton.m_iYPos = f_iYPos; + l_sButton.m_iType = f_iType; + l_sButton.m_iHeight = f_iHeight; + l_sButton.m_iWidth = f_iWidth; + l_sButton.m_iGroup = f_iGroup; + l_sButton.m_iId = f_iId; + + // copy title + memset(&l_sButton.m_pcTitle, 0, sizeof(l_sButton.m_pcTitle)); + memcpy(l_sButton.m_pcTitle, f_pcTitle, strlen(f_pcTitle)); + + switch (f_iType) + { + case BUTTON_CLICK: + l_sButton.m_psImgNormal[0] = BitmapLoad("img/button_click_left.bmp"); + l_sButton.m_psImgNormal[1] = BitmapLoad("img/button_click_center.bmp"); + l_sButton.m_psImgNormal[2] = BitmapLoad("img/button_click_right.bmp"); + + l_sButton.m_psImgHover[0] = BitmapLoad("img/button_click_left_hover.bmp"); + l_sButton.m_psImgHover[1] = BitmapLoad("img/button_click_center_hover.bmp"); + l_sButton.m_psImgHover[2] = BitmapLoad("img/button_click_right_hover.bmp"); + + BitmapConvertWidth(&l_sButton.m_psImgNormal[0], f_iHeight); + BitmapConvertWidth(&l_sButton.m_psImgNormal[1], f_iHeight); + BitmapConvertWidth(&l_sButton.m_psImgNormal[2], f_iHeight); + + BitmapConvertWidth(&l_sButton.m_psImgHover[0], f_iHeight); + BitmapConvertWidth(&l_sButton.m_psImgHover[1], f_iHeight); + BitmapConvertWidth(&l_sButton.m_psImgHover[2], f_iHeight); + + // calculate (center)width of image + l_sButton.m_iCenterWidth = max(f_iWidth - l_sButton.m_psImgNormal[0].m_iWidth - l_sButton.m_psImgNormal[2].m_iWidth, 0); + l_sButton.m_iWidth = l_sButton.m_iCenterWidth + l_sButton.m_psImgNormal[0].m_iWidth + l_sButton.m_psImgNormal[2].m_iWidth; + break; + + case BUTTON_RADIO: + l_sButton.m_psImgNormal[0] = BitmapLoad("img/button_radio.bmp"); + l_sButton.m_psImgHover[0] = BitmapLoad("img/button_radio_hover.bmp"); + l_sButton.m_psImgPressed[0] = BitmapLoad("img/button_radio_pressed.bmp"); + + BitmapConvertWidth(&l_sButton.m_psImgNormal[0], f_iHeight); + BitmapConvertWidth(&l_sButton.m_psImgHover[0], f_iHeight); + BitmapConvertWidth(&l_sButton.m_psImgPressed[0], f_iHeight); + + l_sButton.m_iCenterWidth = 0; + l_sButton.m_iHeight = f_iHeight; + l_sButton.m_iWidth = f_iWidth; + break; + + default: + break; + } + + l_sButton.m_bPressed = FALSE; + l_sButton.m_bHover = FALSE; + + return l_sButton; + +} // ButtonCreate + + +void ButtonClickRender(struct ButtonStruct *f_sButton) +{ + char l_pcTitle[BUTTON_MAX_TITLE]; + struct BitmapStruct *l_sImgButton; + int l_iImageIdLeft, l_iImageIdCenter, l_iImageIdRight; + int l_iLen, l_iXOffset, l_iYOffset, l_iWidth; + struct ColorStruct l_sColor = {0, 0, 0}; + + // copy button attributes + int l_iCnWdt = f_sButton->m_iCenterWidth; + int l_iHeight = f_sButton->m_iHeight; + int l_iXPos = f_sButton->m_iXPos; + int l_iYPos = f_sButton->m_iYPos; + + if (f_sButton->m_bPressed) + { + glColor3d(0.8, 0.9, 1); + } + else + { + glColor3d(1, 1, 1); + } + + // get the right image struct + if (f_sButton->m_bHover) + { + l_sImgButton = f_sButton->m_psImgHover; + } + else + { + l_sImgButton = f_sButton->m_psImgNormal; + } + + // copy buttom images + l_iImageIdLeft = l_sImgButton[0].m_iImageId; + l_iImageIdCenter = l_sImgButton[1].m_iImageId; + l_iImageIdRight = l_sImgButton[2].m_iImageId; + + // copy button title + memcpy(&l_pcTitle, f_sButton->m_pcTitle, strlen(f_sButton->m_pcTitle)); + + // render left side of button + l_iWidth = l_sImgButton[0].m_iWidth; + BitmapRender(l_iXPos, + l_iYPos, + l_iWidth + 1, + l_iHeight, + l_iImageIdLeft); + + // render right side of button + l_iWidth = l_sImgButton[2].m_iWidth; + BitmapRender(l_iXPos + l_iCnWdt + l_iWidth - 1, + l_iYPos, + l_iWidth, + l_iHeight, + l_iImageIdRight); + + // render center of button + if (l_iCnWdt > 0) + { + BitmapRender(l_iXPos + l_iWidth - 1, + l_iYPos, + l_iCnWdt + 1, + l_iHeight, + l_iImageIdCenter); + } + + l_iLen = (int)strlen(f_sButton->m_pcTitle); + l_iXOffset = (int)(0.5 * f_sButton->m_iWidth - 0.5 * l_iLen * FONT_SPACING); + l_iYOffset = (int)(0.5 * f_sButton->m_iHeight - 0.5 * FONT_HEIGHT); + + glPrint(f_sButton->m_iXPos + l_iXOffset, + f_sButton->m_iYPos + l_iYOffset, + f_sButton->m_pcTitle, + l_sColor); + +} // ButtonClickRender + + +void ButtonRadioRender(struct ButtonStruct *f_sButton) +{ + struct BitmapStruct *l_sImgButton; + int l_iXOffset, l_iYOffset, l_iImageRadioId, l_iImageEnabledId; + + // copy button attributes + int l_iWidth = f_sButton->m_iWidth; + int l_iHeight = f_sButton->m_iHeight; + int l_iXPos = f_sButton->m_iXPos; + int l_iYPos = f_sButton->m_iYPos; + struct ColorStruct l_sColor = {0.2, 0.4, 0.8}; + + // get the right image struct + if (f_sButton->m_bHover) + { + l_sImgButton = f_sButton->m_psImgHover; + } + else + { + l_sImgButton = f_sButton->m_psImgNormal; + } + + l_iImageRadioId = l_sImgButton[0].m_iImageId; + l_iImageEnabledId = f_sButton->m_psImgPressed[0].m_iImageId; + + glColor3d(1, 1, 1); + + // render the radio button + BitmapRender(l_iXPos, l_iYPos, l_iWidth, l_iHeight, l_iImageRadioId); + + // render the enable-dot if button is pressed + if (f_sButton->m_bPressed) + { + BitmapRender(l_iXPos, l_iYPos, l_iWidth, l_iHeight, l_iImageEnabledId); + } + + l_iXOffset = (int)f_sButton->m_iWidth; + l_iYOffset = (int)(0.5 * f_sButton->m_iHeight - 0.5 * FONT_HEIGHT); + + glPrint(f_sButton->m_iXPos + l_iXOffset, + f_sButton->m_iYPos + l_iYOffset, + f_sButton->m_pcTitle, + l_sColor); + +} // ButtonRadioRender + + +void ButtonRender(struct ButtonStruct *f_sButton) +{ + int l_iType = f_sButton->m_iType; + + switch (l_iType) + { + case BUTTON_CLICK: + ButtonClickRender(f_sButton); + break; + + case BUTTON_RADIO: + ButtonRadioRender(f_sButton); + break; + + default: + break; + } + +} // ButtonRender + + +void ButtonEnter(struct ButtonStruct *f_sButton) +{ + f_sButton->m_bHover = TRUE; + +} // ButtonHover + + +void ButtonExit(struct ButtonStruct *f_sButton) +{ + f_sButton->m_bHover = FALSE; + +} // ButtonHover + + +void ButtonClickPress(struct ButtonStruct *f_sButton) +{ + if (!f_sButton->m_bPressed) { + ButtonEnable(f_sButton); + } + +} // ButtonClickPress + + +void ButtonRadioPress(struct ButtonStruct *f_sButton) +{ + int i = 0; + + if (!f_sButton->m_bPressed) + { + ButtonEnable(f_sButton); + } + +} // ButtonClickPress + + +void ButtonPress(struct ButtonStruct *f_sButton) +{ + int l_iType = f_sButton->m_iType; + + switch (l_iType) + { + case BUTTON_CLICK: + ButtonClickPress(f_sButton); + break; + + case BUTTON_RADIO: + ButtonRadioPress(f_sButton); + break; + + default: + break; + } + +} // ButtonPress + + +void ButtonClickRelease(struct ButtonStruct *f_sButton) +{ + ButtonDisable(f_sButton); + +} // ButtonClickRelease + + +void ButtonRelease(struct ButtonStruct *f_sButton) +{ + int l_iType = f_sButton->m_iType; + + switch (l_iType) + { + case BUTTON_CLICK: + ButtonClickRelease(f_sButton); + break; + + case BUTTON_RADIO: + default: + break; + } + +} // ButtonRelease + + +void ButtonEnable(struct ButtonStruct *f_sButton) +{ + f_sButton->m_bPressed = TRUE; + +} // ButtonEnable + + +void ButtonDisable(struct ButtonStruct *f_sButton) +{ + f_sButton->m_bPressed = FALSE; + +} // ButtonDisable diff --git a/matchblox/menu/button.h b/matchblox/menu/button.h new file mode 100644 index 0000000..d8f1fe5 --- /dev/null +++ b/matchblox/menu/button.h @@ -0,0 +1,54 @@ +#ifndef _CBUTTON_H +#define _CBUTTON_H + +#include "bitmap.h" + +#define BUTTON_MAX_TITLE 256 +#define BUTTON_MAX_IMGS 3 +#define BUTTON_CLICK_HEIGHT 49 + +struct ButtonStruct { + int m_iXPos; // x positie + int m_iYPos; // y positie + int m_iCenterWidth; // breedte van middenstuk + int m_iWidth; // totale breedte + int m_iHeight; // totale hoogte + int m_bPressed; // pressed or not + int m_bHover; // mouse hovering or not + int m_iType; // button type + int m_iGroup; // group id for radio buttons + int m_iId; // button identifier + + // button caption/title + char m_pcTitle[BUTTON_MAX_TITLE]; + + // button images + struct BitmapStruct m_psImgNormal[BUTTON_MAX_IMGS]; + struct BitmapStruct m_psImgHover[BUTTON_MAX_IMGS]; + struct BitmapStruct m_psImgPressed[BUTTON_MAX_IMGS]; +}; + +enum ButtonType { + BUTTON_CLICK, + BUTTON_RADIO +}; + +enum ButtonGroup { + BUTTON_NO_GROUP, + BUTTON_GROUP1, + BUTTON_GROUP2, + BUTTON_GROUP3, + BUTTON_GROUP4 +}; + +struct ButtonStruct ButtonCreate(int f_dXPos, int f_dYPos, int f_dCenterWidth, int f_dHeight, char *f_pcTitle, int f_iType, int f_iGroup, int f_iId); + +void ButtonRender(struct ButtonStruct *f_sButton); +void ButtonEnter(struct ButtonStruct *f_sButton); +void ButtonExit(struct ButtonStruct *f_sButton); +void ButtonPress(struct ButtonStruct *f_sButton); +void ButtonRelease(struct ButtonStruct *f_sButton); +void ButtonEnable(struct ButtonStruct *f_sButton); +void ButtonDisable(struct ButtonStruct *f_sButton); + +#endif diff --git a/matchblox/menu/menu.c b/matchblox/menu/menu.c new file mode 100644 index 0000000..9276850 --- /dev/null +++ b/matchblox/menu/menu.c @@ -0,0 +1,359 @@ +#ifdef G_OS_WIN32 + #define WIN32_LEAN_AND_MEAN 1 + #include +#else + #define FALSE 0 + #define TRUE !FALSE +#endif + +#include +#include +#include +#include + +#include "menu.h" +#include "button.h" +#include "font.h" + +#define MENU_MAX_BUTTONS 16 + +enum MenuState { + MENU_OFF, + MENU_MAIN, + MENU_START, + MENU_OPTIONS +}; + +struct MenuStruct { + enum MenuState m_iMenuId; + int m_iButtonCount; + struct ButtonStruct m_sButtons[MENU_MAX_BUTTONS]; +}; + +struct MenuStruct g_sMenuOff; // definition of the menu when it's disabled (empty menu) +struct MenuStruct g_sMenuMain; // definition of the main menu +struct MenuStruct g_sMenuStart; // definition of the start menu +struct MenuStruct g_sMenuOptions; // definition of the options menu +struct MenuStruct *g_pCurMenu; // current menu + +struct BitmapStruct g_sCursorImage; // bitmap struct of the cursor + +int g_iWinWidth; +int g_iWinHeight; + +int g_iXPos; // last cursor pos +int g_iYPos; + + +void MenuEnableGroup(int f_iGroup) +{ + struct ButtonStruct l_sButton; + int l_iType, l_iGroup; + int i = 0; + + // enable first radio button in this group + while (i < g_pCurMenu->m_iButtonCount) + { + l_sButton = g_pCurMenu->m_sButtons[i]; + l_iType = l_sButton.m_iType; + l_iGroup = l_sButton.m_iGroup; + + if (l_iType == BUTTON_RADIO && l_iGroup == f_iGroup) + { + ButtonEnable(&g_pCurMenu->m_sButtons[i]); + return; + } + + i++; + } + +} // MenuEnableGroup + + +void MenuAddButton(int f_dXPos, int f_dYPos, int f_dWidth, int f_dHeight, char *f_pcTitle, int f_iType, int f_iGroup) +{ + int i = g_pCurMenu->m_iButtonCount; + + if (i > MENU_MAX_BUTTONS - 1) return; + + // create the button with the right parameters + g_pCurMenu->m_sButtons[i] = ButtonCreate(f_dXPos, f_dYPos, f_dWidth, f_dHeight, f_pcTitle, f_iType, f_iGroup, i); + g_pCurMenu->m_iButtonCount = i + 1; + +} // MenuAddButton + + +void MenuClear(void) +{ + g_pCurMenu->m_iButtonCount = 0; + memset(&g_pCurMenu->m_sButtons, 0, sizeof(g_pCurMenu->m_sButtons)); + +} // MenuClear + + +void MenuBuild (void) +{ + int l_iMenuId = g_pCurMenu->m_iMenuId; + + switch (l_iMenuId) + { + default: + case MENU_OFF: + // no buttons + break; + + case MENU_MAIN: + MenuAddButton(200, 150, 256, 128, "START", BUTTON_CLICK, BUTTON_NO_GROUP); + break; + + case MENU_START: + MenuAddButton(50, 50, 250, 64, "Button 1", BUTTON_CLICK, BUTTON_NO_GROUP); + MenuAddButton(50, 150, 250, 64, "Button 2", BUTTON_CLICK, BUTTON_NO_GROUP); + MenuAddButton(350, 50, 64, 64, "Radio 1", BUTTON_RADIO, BUTTON_GROUP1); + MenuAddButton(350, 150, 64, 64, "Radio 2", BUTTON_RADIO, BUTTON_GROUP1); + MenuEnableGroup(BUTTON_GROUP1); + + MenuAddButton(50, 250, 256, 64, "Button 3", BUTTON_CLICK, BUTTON_NO_GROUP); + MenuAddButton(50, 350, 256, 64, "Button 4", BUTTON_CLICK, BUTTON_NO_GROUP); + MenuAddButton(350, 250, 64, 64, "Radio A", BUTTON_RADIO, BUTTON_GROUP2); + MenuAddButton(350, 350, 64, 64, "Radio B", BUTTON_RADIO, BUTTON_GROUP2); + MenuEnableGroup(BUTTON_GROUP2); + break; + + case MENU_OPTIONS: + MenuAddButton(50, 150, 250, 64, "Start", BUTTON_CLICK, BUTTON_NO_GROUP); + MenuAddButton(50, 250, 250, 64, "Back", BUTTON_CLICK, BUTTON_NO_GROUP); + MenuAddButton(350, 150, 64, 64, "Try first!", BUTTON_RADIO, BUTTON_GROUP1); + MenuAddButton(350, 250, 64, 64, "10 games", BUTTON_RADIO, BUTTON_GROUP1); + MenuEnableGroup(BUTTON_GROUP1); + break; + } + +} // MenuBuild + + +void MenuNext(void) +{ + int l_iMenuId = g_pCurMenu->m_iMenuId; + + l_iMenuId = (l_iMenuId + 1) % 4; + + switch (l_iMenuId) + { + default: + case MENU_OFF: g_pCurMenu = &g_sMenuOff; break; + case MENU_MAIN: g_pCurMenu = &g_sMenuMain; break; + case MENU_START: g_pCurMenu = &g_sMenuStart; break; + case MENU_OPTIONS: g_pCurMenu = &g_sMenuOptions; break; + } + +} // MenuNext + + +void MenuInit(int f_iWinWidth, int f_iWinHeight) +{ + // init menu props + g_iWinWidth = f_iWinWidth; + g_iWinHeight = f_iWinHeight; + g_iXPos = -100; + g_iYPos = -100; + + // init main off + g_sMenuOff.m_iMenuId = MENU_OFF; + g_pCurMenu = &g_sMenuOff; + MenuBuild(); + + // init main menu + g_sMenuMain.m_iMenuId = MENU_MAIN; + g_pCurMenu = &g_sMenuMain; + MenuBuild(); + + // init start menu + g_sMenuStart.m_iMenuId = MENU_START; + g_pCurMenu = &g_sMenuStart; + MenuBuild(); + + // init options menu + g_sMenuOptions.m_iMenuId = MENU_OPTIONS; + g_pCurMenu = &g_sMenuOptions; + MenuBuild(); + + // init font + FontInit(f_iWinWidth, f_iWinHeight); + + g_pCurMenu = &g_sMenuOff; + + // load cursor image + g_sCursorImage = BitmapLoad("img/cursor.bmp"); + +} // MenuInit + + +void MenuRender(void) +{ + int i = 0; + + glClearColor(0.9, 0.9, 0.9, 1); + + glDisable(GL_DEPTH_TEST); + glEnable(GL_TEXTURE_2D); + + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + + glLoadIdentity(); + glOrtho(0, g_iWinWidth, g_iWinHeight, 0, 0, 1); + glMatrixMode(GL_MODELVIEW); + + glEnable(GL_BLEND); + + if (g_pCurMenu->m_iMenuId != MENU_OFF) + { + glBlendFunc(GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR); + + glColor3d(0.6, 0.6, 0.7); + glBegin(GL_TRIANGLE_STRIP); + glVertex2i(0, 0); + glVertex2i(g_iWinWidth, 0); + glVertex2i(0, g_iWinHeight); + glVertex2i(g_iWinWidth, g_iWinHeight); + glEnd(); + } + + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + // render the buttons of the current menu + for (i; i < g_pCurMenu->m_iButtonCount; i++) + { + glColor4d(1, 1, 1, 1); + ButtonRender(&g_pCurMenu->m_sButtons[i]); + } + + // render cursor + glColor3d(1, 1, 1); + BitmapRender(g_iXPos, + g_iYPos, + 64, //g_sCursorImage.m_iWidth, + 64, //g_sCursorImage.m_iHeight, + g_sCursorImage.m_iImageId); + + glDisable(GL_BLEND); + + //restore the previous projection matrix + glMatrixMode(GL_PROJECTION); + + glPopMatrix(); + +} // MenuRender + + +int MenuCollision(struct ButtonStruct *f_sButton, int f_iXPos, int f_iYPos) +{ + int l_bCollision; + int l_iButtonX, l_iButtonY; + int l_iButtonWidth, l_iButtonHeight; + + l_iButtonX = f_sButton->m_iXPos; + l_iButtonY = f_sButton->m_iYPos; + l_iButtonWidth = f_sButton->m_iWidth; + l_iButtonHeight = f_sButton->m_iHeight; + + l_bCollision = f_iXPos >= l_iButtonX; + l_bCollision &= f_iYPos >= l_iButtonY; + l_bCollision &= f_iXPos <= l_iButtonX + l_iButtonWidth; + l_bCollision &= f_iYPos <= l_iButtonY + l_iButtonHeight; + + if (l_bCollision) return TRUE; + return FALSE; + +} // MenuCollision + + +void MenuMouseClick(int f_iGlutButton, int f_iGlutState, int f_iXPos, int f_iYPos) +{ + int i = 0; + int l_iXPos, l_iYPos; + int l_iWidth, l_iHeight; + int l_iType, l_iId, l_iGroup; + struct ButtonStruct l_sButton; + + // button released + if (f_iGlutButton == GLUT_LEFT_BUTTON && f_iGlutState == GLUT_UP) + { + // post a button released event to all buttons + for (i; i < g_pCurMenu->m_iButtonCount; i++) + { + l_iType = g_pCurMenu->m_sButtons[i].m_iType; + ButtonRelease(&g_pCurMenu->m_sButtons[i]); + } + } + + // check if any button needs attention from the mouse + i = g_pCurMenu->m_iButtonCount; + for (i; i >= 0; i--) + { + l_sButton = g_pCurMenu->m_sButtons[i]; + l_iXPos = l_sButton.m_iXPos; + l_iYPos = l_sButton.m_iYPos; + l_iWidth = l_sButton.m_iWidth; + l_iHeight = l_sButton.m_iHeight; + l_iType = l_sButton.m_iType; + l_iId = l_sButton.m_iId; + l_iGroup = l_sButton.m_iGroup; + + if (MenuCollision(&l_sButton, f_iXPos, f_iYPos)) + { + // button pressed? + if (f_iGlutButton == GLUT_LEFT_BUTTON && f_iGlutState == GLUT_DOWN) + { + ButtonPress(&g_pCurMenu->m_sButtons[i]); + + if (l_iType == BUTTON_RADIO) + { + i = 0; + while (i < g_pCurMenu->m_iButtonCount) + { + + if (l_iId != g_pCurMenu->m_sButtons[i].m_iId && + l_iType == g_pCurMenu->m_sButtons[i].m_iType && + l_iGroup == g_pCurMenu->m_sButtons[i].m_iGroup) + { + ButtonDisable(&g_pCurMenu->m_sButtons[i]); + } + i++; + } + } + + return; + } + } + } + +} // MenuMouseClick + + +void MenuMouseMove(int f_iXPos, int f_iYPos) +{ + int i = 0; + struct ButtonStruct l_sButton; + + g_iXPos = f_iXPos; + g_iYPos = f_iYPos; + + // check if any button needs attention from the mouse + for (i; i < g_pCurMenu->m_iButtonCount; i++) + { + l_sButton = g_pCurMenu->m_sButtons[i]; + + if (MenuCollision(&l_sButton, f_iXPos, f_iYPos)) + { + ButtonEnter(&g_pCurMenu->m_sButtons[i]); + } + else // mouse leaves button + { + ButtonExit(&g_pCurMenu->m_sButtons[i]); + } + } + +} // MenuMouseMove + diff --git a/matchblox/menu/menu.h b/matchblox/menu/menu.h new file mode 100644 index 0000000..0b4e95f --- /dev/null +++ b/matchblox/menu/menu.h @@ -0,0 +1,10 @@ +#ifndef _CMENU_H +#define _CMENU_H + +void MenuNext(void); +void MenuInit(int f_iWinWidth, int f_iWinHeight); +void MenuRender(void); +void MenuMouseClick(int button, int state, int x, int y); +void MenuMouseMove(int x, int y); + +#endif diff --git a/matchblox/src/Makefile b/matchblox/src/Makefile deleted file mode 100644 index e242a64..0000000 --- a/matchblox/src/Makefile +++ /dev/null @@ -1,299 +0,0 @@ -# Makefile.in generated by automake 1.10.1 from Makefile.am. -# src/Makefile. Generated from Makefile.in by configure. - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - - - -pkgdatadir = $(datadir)/matchblox -pkglibdir = $(libdir)/matchblox -pkgincludedir = $(includedir)/matchblox -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -subdir = src -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/configure.ac -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = $(top_builddir)/config.h -CONFIG_CLEAN_FILES = -SOURCES = -DIST_SOURCES = -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = ${SHELL} /home/oliver/School/2iv55/matchblox/missing --run aclocal-1.10 -AMTAR = ${SHELL} /home/oliver/School/2iv55/matchblox/missing --run tar -AUTOCONF = ${SHELL} /home/oliver/School/2iv55/matchblox/missing --run autoconf -AUTOHEADER = ${SHELL} /home/oliver/School/2iv55/matchblox/missing --run autoheader -AUTOMAKE = ${SHELL} /home/oliver/School/2iv55/matchblox/missing --run automake-1.10 -AWK = mawk -CC = gcc -CCDEPMODE = depmode=gcc3 -CFLAGS = -g -O2 -CPP = gcc -E -CPPFLAGS = -CYGPATH_W = echo -DEFS = -DHAVE_CONFIG_H -DEPDIR = .deps -ECHO_C = -ECHO_N = -n -ECHO_T = -EGREP = /bin/grep -E -EXEEXT = -GREP = /bin/grep -INSTALL = /usr/bin/install -c -INSTALL_DATA = ${INSTALL} -m 644 -INSTALL_PROGRAM = ${INSTALL} -INSTALL_SCRIPT = ${INSTALL} -INSTALL_STRIP_PROGRAM = $(install_sh) -c -s -LDFLAGS = -LIBOBJS = -LIBS = -LTLIBOBJS = -MAINT = # -MAKEINFO = ${SHELL} /home/oliver/School/2iv55/matchblox/missing --run makeinfo -MKDIR_P = /bin/mkdir -p -OBJEXT = o -PACKAGE = matchblox -PACKAGE_BUGREPORT = -PACKAGE_NAME = matchblox -PACKAGE_STRING = matchblox 0.1 -PACKAGE_TARNAME = matchblox -PACKAGE_VERSION = 0.1 -PATH_SEPARATOR = : -SET_MAKE = -SHELL = /bin/bash -STRIP = -VERSION = 0.1 -abs_builddir = /home/oliver/School/2iv55/matchblox/src -abs_srcdir = /home/oliver/School/2iv55/matchblox/src -abs_top_builddir = /home/oliver/School/2iv55/matchblox -abs_top_srcdir = /home/oliver/School/2iv55/matchblox -ac_ct_CC = gcc -am__include = include -am__leading_dot = . -am__quote = -am__tar = ${AMTAR} chof - "$$tardir" -am__untar = ${AMTAR} xf - -bindir = ${exec_prefix}/bin -build_alias = -builddir = . -datadir = ${datarootdir} -datarootdir = ${prefix}/share -docdir = ${datarootdir}/doc/${PACKAGE_TARNAME} -dvidir = ${docdir} -exec_prefix = ${prefix} -host_alias = -htmldir = ${docdir} -includedir = ${prefix}/include -infodir = ${datarootdir}/info -install_sh = $(SHELL) /home/oliver/School/2iv55/matchblox/install-sh -libdir = ${exec_prefix}/lib -libexecdir = ${exec_prefix}/libexec -localedir = ${datarootdir}/locale -localstatedir = ${prefix}/var -mandir = ${datarootdir}/man -mkdir_p = /bin/mkdir -p -oldincludedir = /usr/include -pdfdir = ${docdir} -prefix = /usr/local -program_transform_name = s,x,x, -psdir = ${docdir} -sbindir = ${exec_prefix}/sbin -sharedstatedir = ${prefix}/com -srcdir = . -sysconfdir = ${prefix}/etc -target_alias = -top_builddir = .. -top_srcdir = .. -AM_CPPFLAGS = \ - -DPACKAGE_LOCALE_DIR=\""$(prefix)/$(DATADIRNAME)/locale"\" \ - -DPACKAGE_SRC_DIR=\""$(srcdir)"\" \ - -DPACKAGE_DATA_DIR=\""$(datadir)"\" - -AM_CFLAGS = \ - -Wall\ - -g - -all: all-am - -.SUFFIXES: -$(srcdir)/Makefile.in: # $(srcdir)/Makefile.am $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu src/Makefile -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: # $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): # $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -tags: TAGS -TAGS: - -ctags: CTAGS -CTAGS: - - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - list='$(DISTFILES)'; \ - dist_files=`for file in $$list; do echo $$file; done | \ - sed -e "s|^$$srcdirstrip/||;t" \ - -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ - case $$dist_files in \ - */*) $(MKDIR_P) `echo "$$dist_files" | \ - sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ - sort -u` ;; \ - esac; \ - for file in $$dist_files; do \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - if test -d $$d/$$file; then \ - dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ - fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ - else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-am -all-am: Makefile -installdirs: -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -clean: clean-am - -clean-am: clean-generic mostlyclean-am - -distclean: distclean-am - -rm -f Makefile -distclean-am: clean-am distclean-generic - -dvi: dvi-am - -dvi-am: - -html: html-am - -info: info-am - -info-am: - -install-data-am: - -install-dvi: install-dvi-am - -install-exec-am: - -install-html: install-html-am - -install-info: install-info-am - -install-man: - -install-pdf: install-pdf-am - -install-ps: install-ps-am - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-generic - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: - -.MAKE: install-am install-strip - -.PHONY: all all-am check check-am clean clean-generic distclean \ - distclean-generic distdir dvi dvi-am html html-am info info-am \ - install install-am install-data install-data-am install-dvi \ - install-dvi-am install-exec install-exec-am install-html \ - install-html-am install-info install-info-am install-man \ - install-pdf install-pdf-am install-ps install-ps-am \ - install-strip installcheck installcheck-am installdirs \ - maintainer-clean maintainer-clean-generic mostlyclean \ - mostlyclean-generic pdf pdf-am ps ps-am uninstall uninstall-am - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/matchblox/src/Makefile.am b/matchblox/src/Makefile.am deleted file mode 100644 index 63a41a4..0000000 --- a/matchblox/src/Makefile.am +++ /dev/null @@ -1,13 +0,0 @@ -## Process this file with automake to produce Makefile.in - -## Created by Anjuta - -AM_CPPFLAGS = \ - -DPACKAGE_LOCALE_DIR=\""$(prefix)/$(DATADIRNAME)/locale"\" \ - -DPACKAGE_SRC_DIR=\""$(srcdir)"\" \ - -DPACKAGE_DATA_DIR=\""$(datadir)"\" - -AM_CFLAGS =\ - -Wall\ - -g - diff --git a/matchblox/src/Makefile.in b/matchblox/src/Makefile.in deleted file mode 100644 index 836c24f..0000000 --- a/matchblox/src/Makefile.in +++ /dev/null @@ -1,299 +0,0 @@ -# Makefile.in generated by automake 1.10.1 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ -VPATH = @srcdir@ -pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -subdir = src -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/configure.ac -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = $(top_builddir)/config.h -CONFIG_CLEAN_FILES = -SOURCES = -DIST_SOURCES = -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = @ACLOCAL@ -AMTAR = @AMTAR@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -GREP = @GREP@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LDFLAGS = @LDFLAGS@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LTLIBOBJS = @LTLIBOBJS@ -MAINT = @MAINT@ -MAKEINFO = @MAKEINFO@ -MKDIR_P = @MKDIR_P@ -OBJEXT = @OBJEXT@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -VERSION = @VERSION@ -abs_builddir = @abs_builddir@ -abs_srcdir = @abs_srcdir@ -abs_top_builddir = @abs_top_builddir@ -abs_top_srcdir = @abs_top_srcdir@ -ac_ct_CC = @ac_ct_CC@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -am__tar = @am__tar@ -am__untar = @am__untar@ -bindir = @bindir@ -build_alias = @build_alias@ -builddir = @builddir@ -datadir = @datadir@ -datarootdir = @datarootdir@ -docdir = @docdir@ -dvidir = @dvidir@ -exec_prefix = @exec_prefix@ -host_alias = @host_alias@ -htmldir = @htmldir@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localedir = @localedir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -pdfdir = @pdfdir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -psdir = @psdir@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -srcdir = @srcdir@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -AM_CPPFLAGS = \ - -DPACKAGE_LOCALE_DIR=\""$(prefix)/$(DATADIRNAME)/locale"\" \ - -DPACKAGE_SRC_DIR=\""$(srcdir)"\" \ - -DPACKAGE_DATA_DIR=\""$(datadir)"\" - -AM_CFLAGS = \ - -Wall\ - -g - -all: all-am - -.SUFFIXES: -$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu src/Makefile -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -tags: TAGS -TAGS: - -ctags: CTAGS -CTAGS: - - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - list='$(DISTFILES)'; \ - dist_files=`for file in $$list; do echo $$file; done | \ - sed -e "s|^$$srcdirstrip/||;t" \ - -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ - case $$dist_files in \ - */*) $(MKDIR_P) `echo "$$dist_files" | \ - sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ - sort -u` ;; \ - esac; \ - for file in $$dist_files; do \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - if test -d $$d/$$file; then \ - dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ - fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ - else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-am -all-am: Makefile -installdirs: -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -clean: clean-am - -clean-am: clean-generic mostlyclean-am - -distclean: distclean-am - -rm -f Makefile -distclean-am: clean-am distclean-generic - -dvi: dvi-am - -dvi-am: - -html: html-am - -info: info-am - -info-am: - -install-data-am: - -install-dvi: install-dvi-am - -install-exec-am: - -install-html: install-html-am - -install-info: install-info-am - -install-man: - -install-pdf: install-pdf-am - -install-ps: install-ps-am - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-generic - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: - -.MAKE: install-am install-strip - -.PHONY: all all-am check check-am clean clean-generic distclean \ - distclean-generic distdir dvi dvi-am html html-am info info-am \ - install install-am install-data install-data-am install-dvi \ - install-dvi-am install-exec install-exec-am install-html \ - install-html-am install-info install-info-am install-man \ - install-pdf install-pdf-am install-ps install-ps-am \ - install-strip installcheck installcheck-am installdirs \ - maintainer-clean maintainer-clean-generic mostlyclean \ - mostlyclean-generic pdf pdf-am ps ps-am uninstall uninstall-am - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/matchblox/src/main.c b/matchblox/src/main.c deleted file mode 100644 index 4d1afb5..0000000 --- a/matchblox/src/main.c +++ /dev/null @@ -1,32 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ -/* - * main.c - * - * Maik, Dennis, Wilrik & Oliver - * - * Copyright (C) 2008 - * - * main.c is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * main.c is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see . - */ - -#include - -#include "opengl.h" - -int main() -{ - renderer_main(); - printf("Hello world\n"); - return (0); -} diff --git a/matchblox/src/renderer_opengl.c b/matchblox/src/renderer_opengl.c deleted file mode 100644 index bc6d773..0000000 --- a/matchblox/src/renderer_opengl.c +++ /dev/null @@ -1,307 +0,0 @@ -/*************************************************************************** - * renderer_opengl.c - * - * Thu Mar 20 15:42:48 2008 - * Copyright 2008 Oliver - * - ****************************************************************************/ - -/* - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Library General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor Boston, MA 02110-1301, USA - */ - - - -/* redblue_stereo.c - demo of stereo for red/blue filter stereo glasses */ - -/* by Walter Vannini (walterv@jps.net, waltervannini@hotmail.com) */ - -/* In stereo mode, the object is drawn in red for the left eye - and blue for the right eye. Viewing the scene with red/blue - filter stereo glasses should give a sense of stereo 3D. - glColorMask is used to control update of the red and blue - channel. glFrustum is used to setup two different view frustums - for each eye based on eye separation. */ - -/* Copyright (c) Walter Vannini, 1998. */ - -/* This program is freely distributable without licensing fees and is - provided without guarantee or warrantee expressed or implied. This - program is -not- in the public domain. */ - -#include -#include -#include - -#ifndef M_PI -#define M_PI 3.14159265358979323846 -#endif - -void init(void); -void KeyboardFunc(unsigned char key, int x, int y); -void MenuFunc(int value); -void IdleFunc(void); -void ReshapeFunc(int w, int h); -void DisplayFunc(void); - - -struct ProgramState -{ - int w; - int h; - GLdouble RotationY; - double eye; - double zscreen; - double znear; - double zfar; - double RotationIncrement; - int solidmode; -}; -struct ProgramState ps; - -const double PIXELS_PER_INCH = 100.0; - -void init(void) -{ - GLfloat mat_ambient[] = {0.2,0.0,0.2,1.0} ; - GLfloat mat_diffuse[] = {0.7,0.0,0.7,1.0} ; - GLfloat mat_specular[] = {0.1,0.0,0.1,1.0} ; - GLfloat mat_shininess[]={20.0}; - - GLfloat light_position[]={0.0,5.0,20.0,1.0}; - - GLfloat light_ambient0[]= {1.0,0.0,0.0,1.0}; - GLfloat light_diffuse0[]= {1.0,0.0,0.0,1.0}; - GLfloat light_specular0[]={1.0,0.0,0.0,1.0}; - - GLfloat light_ambient1[]= {0.0,0.0,1.0,1.0}; - GLfloat light_diffuse1[]= {0.0,0.0,1.0,1.0}; - GLfloat light_specular1[]={0.0,0.0,1.0,1.0}; - - glDisable(GL_DITHER); - glClearColor(0.0, 0.0, 0.0, 1.0); - glShadeModel(GL_SMOOTH); - glEnable(GL_DEPTH_TEST); - glEnable(GL_NORMALIZE); - glEnable(GL_CULL_FACE); - glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, 1); - - - glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient); - glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse); - glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular); - glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess); - - glLightfv(GL_LIGHT0, GL_POSITION, light_position); - glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient0); - glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse0); - glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular0); - - glLightfv(GL_LIGHT1, GL_POSITION, light_position); - glLightfv(GL_LIGHT1, GL_AMBIENT, light_ambient1); - glLightfv(GL_LIGHT1, GL_DIFFUSE, light_diffuse1); - glLightfv(GL_LIGHT1, GL_SPECULAR, light_specular1); - glEnable(GL_LIGHTING); - - ps.eye=0.80; - ps.zscreen = 10.0; - ps.znear = 7.0; - ps.zfar = 13.0; - ps.RotationY = 0.0; - ps.RotationIncrement = 0.1; - ps.solidmode = 1; -} - -void KeyboardFunc(unsigned char key, int x, int y) -{ - switch(key) - { - case 27: /* escape */ - case 'q': - case 'Q': - exit(0); - break; - case 's': /* stereo */ - ps.eye = 1.20; - break; - case '1': - ps.solidmode = 1; - glFrontFace(GL_CCW); - break; - case '2': - ps.solidmode = 2; - glFrontFace(GL_CCW); - break; - case '3': - ps.solidmode = 3; - /* The teapot polygons face the wrong way. Sigh. */ - glFrontFace(GL_CW); - break; - case '4': - ps.solidmode = 4; - glFrontFace(GL_CCW); - break; - case 'm': /* mono */ - ps.eye = 0.0; - break; - } -} - -void MenuFunc(int value) -{ - KeyboardFunc(value, 0, 0); -} - -void IdleFunc(void) -{ - ps.RotationY += ps.RotationIncrement; - glutPostRedisplay(); -} - -void ReshapeFunc(int w, int h) -{ - glViewport(0,0, w, h); - ps.w = w; - ps.h = h; -} - -void DisplayFunc(void) -{ - double xfactor=1.0, yfactor=1.0; - double Eye =0.0; - int i; - - if(ps.w < ps.h) - { - xfactor = 1.0; - yfactor = ps.h/ps.w; - } - else if(ps.h < ps.w) - { - xfactor = ps.w/ps.h; - yfactor = 1.0; - } - - glClear(GL_COLOR_BUFFER_BIT); - for(i=0;i<2;i++) - { - glEnable(GL_LIGHT0 + i); - glClear(GL_DEPTH_BUFFER_BIT); - if(i==0) /* left eye - RED */ - { - Eye = ps.eye; - glColorMask(GL_TRUE,GL_FALSE,GL_FALSE,GL_TRUE); - } - else /* if(i==1) right eye - BLUE */ - { - Eye = -ps.eye; - glColorMask(GL_FALSE,GL_FALSE,GL_TRUE,GL_TRUE); - } - - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glFrustum( - (-(ps.w/(2.0*PIXELS_PER_INCH))+Eye) *(ps.znear/ps.zscreen)*xfactor, - (ps.w/(2.0*PIXELS_PER_INCH)+Eye) *(ps.znear/ps.zscreen)*xfactor, - -(ps.h/(2.0*PIXELS_PER_INCH))*(ps.znear/ps.zscreen)*yfactor, - (ps.h/(2.0*PIXELS_PER_INCH))*(ps.znear/ps.zscreen)*yfactor, - ps.znear, ps.zfar); - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - glTranslatef(Eye,0.0,0.0); - glTranslated(0,0,-ps.zscreen); - - switch(ps.solidmode) - { - case 1: - { - glTranslated(cos(ps.RotationY*M_PI/180.0), - 0, -sin(ps.RotationY*M_PI/180.0) ); - glRotated(ps.RotationY, 0.0,0.1,0.0); - glPushMatrix(); - glScalef(0.5,0.5,0.5); - glutSolidDodecahedron(); - glPopMatrix(); - break; - } - case 2: - { - glTranslated(cos(ps.RotationY*M_PI/180.0), - 0, -sin(ps.RotationY*M_PI/180.0) ); - glRotated(ps.RotationY, 0.0,0.1,0.0); - glutSolidIcosahedron(); - break; - } - case 3: - { - glRotated(60.0, 1 , 0, 0); - glTranslated(cos(ps.RotationY*M_PI/180.0), - 0, -sin(ps.RotationY*M_PI/180.0) ); - glRotated(ps.RotationY, 0.0,0.1,0.0); - glutSolidTeapot(1.0); - break; - } - case 4: - { - glRotated(60.0, 1, 0, 0); - glTranslated(cos(ps.RotationY *M_PI/180), - 0, -sin(ps.RotationY *M_PI/180) ); - glRotated(ps.RotationY, 0.0, 0.1, 0.0); - glutSolidTorus(0.2, 0.5, 5.0, 5.0); - break; - } - } - glDisable(GL_LIGHT0 + i); - } - glColorMask(GL_TRUE,GL_TRUE,GL_TRUE,GL_TRUE); - glutSwapBuffers(); -} -void -VisibilityFunc(int vis) -{ - if (vis == GLUT_VISIBLE) { - glutIdleFunc(IdleFunc); - } else { - glutIdleFunc(NULL); - } -} - -int renderer_main(void) -{ - glutInit(&argc, argv); - glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA ); - ps.w = 512; - ps.h = 512; - glutInitWindowSize(ps.w, ps.h); - glutInitWindowPosition(100,100); - - glutCreateWindow(argv[0]); - init(); - glutVisibilityFunc(VisibilityFunc); - glutDisplayFunc(DisplayFunc); - glutReshapeFunc(ReshapeFunc); - glutKeyboardFunc(KeyboardFunc); - glutCreateMenu(MenuFunc); - glutAddMenuEntry("Stereo", 's'); - glutAddMenuEntry("Mono", 'm'); - glutAddMenuEntry("Dodecahedron", '1'); - glutAddMenuEntry("Icosahedron", '2'); - glutAddMenuEntry("Teapot", '3'); - glutAddMenuEntry("Solar system", '4'); - glutAttachMenu(GLUT_RIGHT_BUTTON); - glutMainLoop(); - - return 0; -} diff --git a/matchblox/src/renderer_opengl.h b/matchblox/src/renderer_opengl.h deleted file mode 100644 index ca50b59..0000000 --- a/matchblox/src/renderer_opengl.h +++ /dev/null @@ -1,25 +0,0 @@ -/*************************************************************************** - * renderer_opengl.h - * - * Thu Mar 20 15:43:12 2008 - * Copyright 2008 Oliver - * - ****************************************************************************/ - -/* - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Library General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor Boston, MA 02110-1301, USA - */ - - int renderer_main(void); diff --git a/matchblox/typedefs.h b/matchblox/typedefs.h new file mode 100644 index 0000000..0262c14 --- /dev/null +++ b/matchblox/typedefs.h @@ -0,0 +1,128 @@ +#ifndef TYPEDEFS_H + +#define TYPEDEFS_H + +#include +#include + +typedef struct bb +{ + bb() { + //init a bounding box with the min values set to max double and visa versa + m_dLeft = m_dBottom = m_dFront = std::numeric_limits::max(); + m_dRight = m_dTop = m_dBack = -std::numeric_limits::max(); + } + + double m_dLeft, //min x + m_dBottom, //min y + m_dFront, //min z + m_dRight, //max x + m_dTop, //max y + m_dBack; //max z + +} BoundingBox_t; + +typedef struct vec3d +{ + double x, y, z; + + //constructors + vec3d() + { x=0.0, y=0.0, z=0.0; } + vec3d(double fx, double fy, double fz) + { x=fx, y=fy, z=fz; } + vec3d(const vec3d &clone) + { x=clone.x; y=clone.y; z=clone.z; } + + inline vec3d& operator=(const vec3d &rhs) + { x=rhs.x; y=rhs.y; z=rhs.z; return *this; } + inline vec3d& operator+=(const vec3d &rhs) + { x+=rhs.x; y+=rhs.y; z+=rhs.z; return *this; } + inline vec3d& operator-=(const vec3d &rhs) + { x-=rhs.x; y-=rhs.y; z-=rhs.z; return *this; } + inline vec3d& operator*=(const vec3d &rhs) + { x*=rhs.x; y*=rhs.y; z*=rhs.z; return *this; } + inline vec3d& operator*=(const double &scal) + { x*=scal; y*=scal; z*=scal; return *this; } + + inline const vec3d& operator+(const vec3d &rhs) + { return vec3d(*this) += rhs; } + inline const vec3d& operator-(const vec3d &rhs) + { return vec3d(*this) -= rhs; } + inline const vec3d& operator*(const vec3d &rhs) + { return vec3d(*this) *= rhs; } + inline const vec3d& operator*(const double &scal) + { return vec3d(*this) *= scal; } +} Vect3D_t; + + + +inline void UpdBBox(BoundingBox_t &B, Vect3D_t &V) +{ + if (V.x < B.m_dLeft) + B.m_dLeft = V.x; + else if (V.x > B.m_dRight) + B.m_dRight = V.x; + if (V.y < B.m_dBottom) + B.m_dBottom = V.y; + else if (V.y > B.m_dTop) + B.m_dTop = V.y; + if (V.z < B.m_dFront) + B.m_dFront = V.z; + else if (V.z > B.m_dBack) + B.m_dBack = V.z; +}; + +typedef struct triangle +{ + int v1, n1, t1, + v2, n2, t2, + v3, n3, t3; +} Triangle_t; + +typedef struct mat +{ + GLfloat m_fAmb[4], + m_fDif[4], + m_fSpec[4], + m_fEmi[4], + m_fShin; + + //default constructor + mat() + { + m_fAmb[0] = m_fAmb[1] = m_fAmb[2] = 0.7f; m_fAmb[3] = 1.0f; + m_fDif[0] = m_fDif[1] = m_fDif[3] = 0.7f; m_fDif[3] = 1.0f; + m_fSpec[0] = m_fSpec[1] = m_fSpec[2] = m_fSpec[3] = 1.0f; + m_fEmi[0] = m_fEmi[1] = m_fEmi[2] = 0.0f; m_fEmi[3] = 1.0f; + m_fShin = 128.0f; + } + //for convenience + inline void setAmb(float r, float g, float b, float a) + { m_fAmb[0] = r; m_fAmb[1] = g; m_fAmb[2] = b; m_fAmb[3] = a; } + inline void setDif(float r, float g, float b, float a) + { m_fDif[0] = r; m_fDif[1] = g; m_fDif[2] = b; m_fDif[3] = a; } + inline void setSpec(float r, float g, float b, float a) + { m_fSpec[0] = r; m_fSpec[1] = g; m_fSpec[2] = b; m_fSpec[3] = a; } + inline void setEmi(float r, float g, float b, float a) + { m_fEmi[0] = r; m_fEmi[1] = g; m_fEmi[2] = b; m_fEmi[3] = a; } + +} MatProps_t; +/* +typedef struct facegroup +{ + MatProps_t m_material; + std::vector m_faces; +} FaceGroup_t; +*/ + +typedef struct geom +{ + std::vector m_verts, + m_norms, + m_texs; + std::vector m_triangles; +} Geometry_t; + +#endif //TYPEDEFS_H + -- cgit v0.12