#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); //neg x (left) glBindTexture(GL_TEXTURE_2D, m_uiFaceTex[0]); glTexEnvf(GL_TEXTURE_2D, GL_TEXTURE_ENV_MODE, GL_REPLACE); RenderFace(l_Vertices, 3, 0, 4, 7); //neg y (down) glBindTexture(GL_TEXTURE_2D, m_uiFaceTex[1]); glTexEnvf(GL_TEXTURE_2D, GL_TEXTURE_ENV_MODE, GL_REPLACE); RenderFace(l_Vertices, 3, 2, 1, 0); //nez z (front) glBindTexture(GL_TEXTURE_2D, m_uiFaceTex[2]); glTexEnvf(GL_TEXTURE_2D, GL_TEXTURE_ENV_MODE, GL_REPLACE); RenderFace(l_Vertices, 2, 3, 7, 6); //pos x (right) glBindTexture(GL_TEXTURE_2D, m_uiFaceTex[3]); glTexEnvf(GL_TEXTURE_2D, GL_TEXTURE_ENV_MODE, GL_REPLACE); RenderFace(l_Vertices, 1, 2, 6, 5); //pos y (top) glBindTexture(GL_TEXTURE_2D, m_uiFaceTex[4]); glTexEnvf(GL_TEXTURE_2D, GL_TEXTURE_ENV_MODE, GL_REPLACE); RenderFace(l_Vertices, 4, 5, 6, 7); //pos z (back) glBindTexture(GL_TEXTURE_2D, m_uiFaceTex[5]); glTexEnvf(GL_TEXTURE_2D, GL_TEXTURE_ENV_MODE, GL_REPLACE); 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(); }