include/gltexturecubemap.hpp
694871da
 #ifndef GLTEXTURECUBEMAP_HPP_
 #define GLTEXTURECUBEMAP_HPP_
 
 
 #include <string>
 #include <utility>
 
 #include <globject.hpp>
 #include <gltexturend.hpp>
 
 
 /// Class
 
 class GLTextureCubemap : public GLTextureND<2>
 {
 public:
 
     /// Special member functions
 
     explicit GLTextureCubemap(
         std::string object_label,
         Size        size,
         GLenum      internal_format = GL_RGB8,
         GLenum      wrap            = GL_CLAMP_TO_EDGE,
         GLenum      min_filter      = GL_LINEAR,
         GLenum      mag_filter      = GL_LINEAR
     );
 
     /// Core
 
     GLTextureCubemap static const & empty();
 
     /// TGA
 
     GLTextureCubemap static tga_read(
         Paths const & paths,
         GLenum        format          = GL_BGRA,
         GLenum        internal_format = GL_SRGB8_ALPHA8,
         GLenum        wrap            = GL_CLAMP_TO_EDGE,
         GLenum        min_filter      = GL_LINEAR,
         GLenum        mag_filter      = GL_LINEAR
     );
 
     void tga_write(
         Paths const & paths,
         GLenum        format = GL_BGRA
     ) const;
 
 protected:
 
     /// Core
 
     void virtual data_(
         void const * data,
         GLenum       target,
         GLenum       format,
         GLenum       type
     ) override;
 
     /// Check
 
     void static check_cubemap_paths_(Paths const & paths);
     void        check_cubemap_size_() const;
 
 private:
 
     /// Core
 
     auto static constexpr faces_ = GLuint{6};
 };
 
 
 /// Special member functions
 
 inline GLTextureCubemap::GLTextureCubemap(
     std::string object_label,
     Size        size,
     GLenum      internal_format,
     GLenum      wrap,
     GLenum      min_filter,
     GLenum      mag_filter
 )
 :
     GLTextureND(
         std::move(object_label),
         GL_TEXTURE_CUBE_MAP,
         GL_TEXTURE_BINDING_CUBE_MAP,
         GL_MAX_CUBE_MAP_TEXTURE_SIZE,
         size,
         internal_format,
         wrap,
         min_filter,
         mag_filter
     )
 {
     try
     {
         check_cubemap_size_();
         for (auto face = GLuint{0}; face < faces_; ++face)
         {
             glTexImage2D(
                 GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, 0,
                 (GLint)internal_format,
                 size[0], size[1], 0,
                 GL_RED, GL_UNSIGNED_BYTE, nullptr
             );
             check_error_(glGetError());
         }
         if (supported({3, 2}, "GL_ARB_seamless_cube_map"))
             glEnable(GL_TEXTURE_CUBE_MAP_SEAMLESS);
     }
     catch (...)
     {
         fail_action_("create");
     }
 }
 
 /// Core
 
 inline GLTextureCubemap const & GLTextureCubemap::empty()
 {
     return empty_<GLTextureCubemap>();
 }
 
 inline void GLTextureCubemap::data_(
     void const * data,
     GLenum       target,
     GLenum       format,
     GLenum       type
 )
 {
     glTexSubImage2D(
         target, 0,
         0, 0,
         size()[0], size()[1],
         format, type, data
     );
 }
 
 
 #endif // GLTEXTURECUBEMAP_HPP_