#ifndef GLTEXTURE2D_HPP_ #define GLTEXTURE2D_HPP_ #include #include #include #include /// 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_(); } 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_