#pragma once #include #include #include class Texture { private: GLuint _id; protected: const char* _texture; public: GLuint Reference() const { return _id; } public: Texture() : _id(0) { } Texture(const char* file) { int width, height, len; stbi_set_flip_vertically_on_load(1); unsigned char* data = stbi_load(file, &width, &height, &len, STBI_rgb_alpha); glGenTextures(1, &_id); glBindTexture(GL_TEXTURE_2D, _id); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data); glGenerateMipmap(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, 0); stbi_image_free(data); } Texture(const Texture& other) : Texture(other._texture) { } Texture& operator=(const Texture& other) { if (this == &other) return *this; Texture copy(other._texture); this->_id = other._id; this->_texture = other._texture; copy._id = 0; copy._texture = nullptr; return *this; } Texture(Texture&& other) noexcept { _id = other._id; _texture = other._texture; other._id = 0; other._texture = nullptr; } Texture& operator= (Texture&& other) noexcept { if (this == &other) return *this; this->_id = other._id; this->_texture = other._texture; other._id = 0; other._texture = nullptr; } ~Texture() { if (_id == 0) return; glDeleteTextures(1, &_id); } void Use() const { glBindTexture(GL_TEXTURE_2D, _id); } void Disable() const { glBindTexture(GL_TEXTURE_2D, 0); } };