From 4a639bc5e80fce2467855a9e8f4c6cdff2f0adc0 Mon Sep 17 00:00:00 2001 From: Mikko Rasa Date: Sat, 18 Sep 2021 15:21:09 +0300 Subject: [PATCH] Make the TextureCubeFace enum independent of OpenGL constants --- source/core/framebuffer.cpp | 4 +-- source/core/texturecube.cpp | 60 ++++++++++++------------------- source/core/texturecube.h | 21 +++++------ source/effects/environmentmap.cpp | 4 +-- 4 files changed, 34 insertions(+), 55 deletions(-) diff --git a/source/core/framebuffer.cpp b/source/core/framebuffer.cpp index d6fa9739..a60b437e 100644 --- a/source/core/framebuffer.cpp +++ b/source/core/framebuffer.cpp @@ -156,7 +156,7 @@ void Framebuffer::update() const else if(type==GL_TEXTURE_3D) glFramebufferTexture3D(GL_FRAMEBUFFER, gl_attach_point, type, attch.tex->get_id(), attch.level, attch.layer); else if(type==GL_TEXTURE_CUBE_MAP) - glFramebufferTexture2D(GL_FRAMEBUFFER, gl_attach_point, TextureCube::enumerate_faces(attch.layer), attch.tex->get_id(), attch.level); + glFramebufferTexture2D(GL_FRAMEBUFFER, gl_attach_point, get_gl_cube_face(static_cast(attch.layer)), attch.tex->get_id(), attch.level); } else if(ARB_direct_state_access) glNamedFramebufferTexture(id, gl_attach_point, 0, 0); @@ -288,7 +288,7 @@ void Framebuffer::attach(FrameAttachment attch, Texture3D &tex, unsigned layer, void Framebuffer::attach(FrameAttachment attch, TextureCube &tex, TextureCubeFace face, unsigned level) { - set_attachment(make_typed_attachment(attch, tex.get_format()), tex, level, TextureCube::get_face_index(face), 0); + set_attachment(make_typed_attachment(attch, tex.get_format()), tex, level, face, 0); } void Framebuffer::attach_layered(FrameAttachment attch, Texture3D &tex, unsigned level) diff --git a/source/core/texturecube.cpp b/source/core/texturecube.cpp index 516dca52..2a15eb1b 100644 --- a/source/core/texturecube.cpp +++ b/source/core/texturecube.cpp @@ -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(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(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(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(); diff --git a/source/core/texturecube.h b/source/core/texturecube.h index 0f83e29e..58184586 100644 --- a/source/core/texturecube.h +++ b/source/core/texturecube.h @@ -11,12 +11,12 @@ namespace GL { enum TextureCubeFace { - POSITIVE_X = GL_TEXTURE_CUBE_MAP_POSITIVE_X, - NEGATIVE_X = GL_TEXTURE_CUBE_MAP_NEGATIVE_X, - POSITIVE_Y = GL_TEXTURE_CUBE_MAP_POSITIVE_Y, - NEGATIVE_Y = GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, - POSITIVE_Z = GL_TEXTURE_CUBE_MAP_POSITIVE_Z, - NEGATIVE_Z = GL_TEXTURE_CUBE_MAP_NEGATIVE_Z + POSITIVE_X = 0, + NEGATIVE_X = 1, + POSITIVE_Y = 2, + NEGATIVE_Y = 3, + POSITIVE_Z = 4, + NEGATIVE_Z = 5 }; /** @@ -53,7 +53,6 @@ private: unsigned size; unsigned levels; - static const TextureCubeFace face_order[6]; static const Vector3 directions[6]; static const unsigned orientations[12]; @@ -88,12 +87,6 @@ private: unsigned get_level_size(unsigned) const; public: - /** Translates indices into face constants. Valid indices are between 0 - and 5, inclusive. */ - static TextureCubeFace enumerate_faces(unsigned); - - static unsigned get_face_index(TextureCubeFace); - /** Returns a vector pointing out of the face. */ static const Vector3 &get_face_direction(TextureCubeFace); @@ -111,6 +104,8 @@ public: virtual void unload() { } }; +GLenum get_gl_cube_face(TextureCubeFace); + void operator>>(const LexicalConverter &, TextureCubeFace &); } // namespace GL diff --git a/source/effects/environmentmap.cpp b/source/effects/environmentmap.cpp index 87e4898d..a675f7e2 100644 --- a/source/effects/environmentmap.cpp +++ b/source/effects/environmentmap.cpp @@ -48,7 +48,7 @@ void EnvironmentMap::init(unsigned s, PixelFormat f, unsigned l) depth_buf.storage(DEPTH_COMPONENT32F, size, size, 1); for(unsigned i=0; i<6; ++i) { - TextureCubeFace face = TextureCube::enumerate_faces(i); + TextureCubeFace face = static_cast(i); faces[i].fbo.set_format((COLOR_ATTACHMENT,f, DEPTH_ATTACHMENT,DEPTH_COMPONENT32F)); faces[i].fbo.attach(COLOR_ATTACHMENT, env_tex, face, 0); faces[i].fbo.attach(DEPTH_ATTACHMENT, depth_buf); @@ -75,7 +75,7 @@ void EnvironmentMap::init(unsigned s, PixelFormat f, unsigned l) LinAl::Matrix face_matrices[6]; for(unsigned i=0; i<6; ++i) { - GL::TextureCubeFace face = GL::TextureCube::enumerate_faces(i); + GL::TextureCubeFace face = static_cast(i); GL::Vector3 columns[3]; columns[0] = GL::TextureCube::get_s_direction(face); columns[1] = GL::TextureCube::get_t_direction(face); -- 2.45.2