]> git.tdb.fi Git - libs/gl.git/blobdiff - source/core/texturecube.cpp
Make the TextureCubeFace enum independent of OpenGL constants
[libs/gl.git] / source / core / texturecube.cpp
index 516dca5209c9e571c7dc1a19093712fdfda201e1..2a15eb1bec3359a3f665e4d48c4f62392644b41f 100644 (file)
@@ -13,16 +13,6 @@ using namespace std;
 namespace Msp {
 namespace GL {
 
-const TextureCubeFace TextureCube::face_order[6] =
-{
-       POSITIVE_X,
-       NEGATIVE_X,
-       POSITIVE_Y,
-       NEGATIVE_Y,
-       POSITIVE_Z,
-       NEGATIVE_Z
-};
-
 const Vector3 TextureCube::directions[6] =
 {
        Vector3(1, 0, 0),
@@ -96,7 +86,7 @@ void TextureCube::storage(PixelFormat fmt, unsigned sz, unsigned lv)
                {
                        unsigned lv_size = get_level_size(i);
                        for(unsigned j=0; j<6; ++j)
-                               glTexImage2D(enumerate_faces(j), i, gl_fmt, lv_size, lv_size, 0, comp, type, 0);
+                               glTexImage2D(get_gl_cube_face(static_cast<TextureCubeFace>(j)), i, gl_fmt, lv_size, lv_size, 0, comp, type, 0);
                }
                glTexParameteri(target, GL_TEXTURE_MAX_LEVEL, levels-1);
        }
@@ -117,14 +107,15 @@ void TextureCube::sub_image(TextureCubeFace face, unsigned level, int x, int y,
        if(level>=levels)
                throw out_of_range("TextureCube::sub_image");
 
+       GLenum gl_face = get_gl_cube_face(face);
        GLenum comp = get_gl_components(get_components(storage_fmt));
        GLenum type = get_gl_type(get_component_type(storage_fmt));
        if(ARB_direct_state_access)
-               glTextureSubImage3D(id, level, x, y, get_face_index(face), wd, ht, 1, comp, type, data);
+               glTextureSubImage3D(id, level, x, y, face, wd, ht, 1, comp, type, data);
        else
        {
                bind_scratch();
-               glTexSubImage2D(face, level, x, y, wd, ht, comp, type, data);
+               glTexSubImage2D(gl_face, level, x, y, wd, ht, comp, type, data);
        }
 }
 
@@ -159,7 +150,7 @@ void TextureCube::image(const Graphics::Image &img, unsigned lv)
        const char *pixels = reinterpret_cast<const char *>(img.get_pixels());
        unsigned face_size = img.get_stride()*size;
        for(unsigned i=0; i<6; ++i)
-               image(enumerate_faces(i), 0, pixels+i*face_size);
+               image(static_cast<TextureCubeFace>(i), 0, pixels+i*face_size);
 }
 
 unsigned TextureCube::get_n_levels() const
@@ -174,40 +165,19 @@ unsigned TextureCube::get_level_size(unsigned level) const
        return size>>level;
 }
 
-TextureCubeFace TextureCube::enumerate_faces(unsigned i)
-{
-       if(i>=6)
-               throw out_of_range("TextureCube::enumerate_faces");
-       return face_order[i];
-}
-
-unsigned TextureCube::get_face_index(TextureCubeFace face)
-{
-       switch(face)
-       {
-       case POSITIVE_X: return 0;
-       case NEGATIVE_X: return 1;
-       case POSITIVE_Y: return 2;
-       case NEGATIVE_Y: return 3;
-       case POSITIVE_Z: return 4;
-       case NEGATIVE_Z: return 5;
-       default: throw invalid_argument("TextureCube::get_face_index");
-       }
-}
-
 const Vector3 &TextureCube::get_face_direction(TextureCubeFace face)
 {
-       return directions[get_face_index(face)];
+       return directions[face];
 }
 
 const Vector3 &TextureCube::get_s_direction(TextureCubeFace face)
 {
-       return directions[orientations[get_face_index(face)*2]];
+       return directions[orientations[face*2]];
 }
 
 const Vector3 &TextureCube::get_t_direction(TextureCubeFace face)
 {
-       return directions[orientations[get_face_index(face)*2+1]];
+       return directions[orientations[face*2+1]];
 }
 
 Vector3 TextureCube::get_texel_direction(TextureCubeFace face, unsigned u, unsigned v)
@@ -281,6 +251,20 @@ void TextureCube::Loader::storage_levels(PixelFormat fmt, unsigned s, unsigned l
 }
 
 
+GLenum get_gl_cube_face(TextureCubeFace face)
+{
+       switch(face)
+       {
+       case POSITIVE_X: return GL_TEXTURE_CUBE_MAP_POSITIVE_X;
+       case NEGATIVE_X: return GL_TEXTURE_CUBE_MAP_NEGATIVE_X;
+       case POSITIVE_Y: return GL_TEXTURE_CUBE_MAP_POSITIVE_Y;
+       case NEGATIVE_Y: return GL_TEXTURE_CUBE_MAP_NEGATIVE_Y;
+       case POSITIVE_Z: return GL_TEXTURE_CUBE_MAP_POSITIVE_Z;
+       case NEGATIVE_Z: return GL_TEXTURE_CUBE_MAP_NEGATIVE_Z;
+       default: throw invalid_argument("get_gl_cube_face");
+       }
+}
+
 void operator>>(const LexicalConverter &conv, TextureCubeFace &face)
 {
        const string &str = conv.get();