summaryrefslogtreecommitdiffstats
path: root/matchblox/engine/C_Environment.cpp
blob: 0c7cbfd35fe71e313035fadaf2a903fb2b01d07c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
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();
  
}