summaryrefslogtreecommitdiffstats
path: root/matchblox/engine/C_Environment.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'matchblox/engine/C_Environment.cpp')
-rw-r--r--matchblox/engine/C_Environment.cpp119
1 files changed, 119 insertions, 0 deletions
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 <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();
+
+}