include/gltexture2d.hpp
694871da
 #ifndef GLTEXTURE2D_HPP_
 #define GLTEXTURE2D_HPP_
 
 
 #include <string>
 #include <utility>
 
 #include <globject.hpp>
 #include <gltexturend.hpp>
 
 
 /// Class
 
 class GLTexture2D : public GLTextureND<2>
 {
 public:
 
     /// Special member functions
 
     explicit GLTexture2D(
         std::string object_label,
         Size        size,
         GLenum      internal_format = GL_RGBA8,
         GLenum      wrap            = GL_REPEAT,
         GLenum      min_filter      = GL_LINEAR_MIPMAP_LINEAR,
         GLenum      mag_filter      = GL_LINEAR
     );
 
     /// Core
 
     GLTexture2D static const & empty();
 
     /// TGA
 
     GLTexture2D static tga_read(
         Path const & path,
         GLenum       format          = GL_BGRA,
         GLenum       internal_format = GL_SRGB8_ALPHA8,
         GLenum       wrap            = GL_REPEAT,
         GLenum       min_filter      = GL_LINEAR_MIPMAP_LINEAR,
         GLenum       mag_filter      = GL_LINEAR
     );
 
     void tga_write(
         Path const & path,
         GLenum       format = GL_BGRA
     ) const;
 
 private:
 
     /// Core
 
     void virtual data_(
         void const * data,
         GLenum       target,
         GLenum       format,
         GLenum       type
     ) override;
 };
 
 
 /// Special member functions
 
 inline GLTexture2D::GLTexture2D(
     std::string object_label,
     Size        size,
     GLenum      internal_format,
     GLenum      wrap,
     GLenum      min_filter,
     GLenum      mag_filter
 )
 :
     GLTextureND(
         std::move(object_label),
         GL_TEXTURE_2D,
         GL_TEXTURE_BINDING_2D,
         GL_MAX_TEXTURE_SIZE,
         size,
         internal_format,
         wrap,
         min_filter,
         mag_filter
     )
 {
     try
     {
         glTexImage2D(
             target_, 0,
             (GLint)internal_format,
             size[0], size[1], 0,
             GL_RED, GL_UNSIGNED_BYTE, nullptr
         );
         check_error_(glGetError());
     }
     catch (...)
     {
         fail_action_("create");
     }
 }
 
 /// Core
 
 inline GLTexture2D const & GLTexture2D::empty()
 {
     return empty_<GLTexture2D>();
 }
 
 inline void GLTexture2D::data_(
     void const * data,
     GLenum       target,
     GLenum       format,
     GLenum       type
 )
 {
     glTexSubImage2D(
         target, 0,
         0, 0,
         size()[0], size()[1],
         format, type, data
     );
 }
 
 
 #endif // GLTEXTURE2D_HPP_