diff options
Diffstat (limited to 'matchblox/C_Environment.cpp')
-rw-r--r-- | matchblox/C_Environment.cpp | 119 |
1 files changed, 119 insertions, 0 deletions
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 <GL/glut.h> +#include <string> +#include <iostream> + +#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(); + +} |