diff --git a/include/Texture.h b/include/Texture.h index ed521f6..f501671 100644 --- a/include/Texture.h +++ b/include/Texture.h @@ -13,27 +13,35 @@ enum TexType { TEX_AVAILABLE_COUNT }; -class Texture +// Абстрактный класс базовой текстуры +class BaseTexture { public: - Texture(GLuint type = TEX_AVAILABLE_COUNT, const std::string& filename = ""); // Загрузка текстуры с диска или использование "пустой" - Texture(GLuint width, GLuint height, GLuint attachment, GLuint texType = TEX_DIFFUSE, GLint internalformat = GL_RGBA, GLint format = GL_RGBA, GLenum dataType = GL_FLOAT); // Конструктор текстуры заданного размера для использования в буфере - Texture(const Texture& other); // Конструктор копирования - ~Texture(); - - Texture& operator=(const Texture& other); // Оператор присваивания - - void reallocate(GLuint width, GLuint height, GLuint texType = TEX_DIFFUSE, GLint internalformat = GL_RGBA, GLint format = GL_RGBA, GLenum dataType = GL_FLOAT); // Пересоздает текстуру для имеющегося дескриптора - - void use(); // Привязка текстуры + ~BaseTexture(); + virtual void use() = 0; // Привязка текстуры static void disable(GLuint type); // Отвязка текстуры по типу GLuint getType(); // Возвращает тип текстуры void setType(GLuint type); // Задает тип текстуры - private: + protected: GLuint handler; // Дескриптор текстуры GLuint type; // Тип текстуры, соответствует её слоту static std::map filename_handler; // Получение дескриптора текстуры по её имени static std::map handler_count; // Получение количества использований по дескриптору текстуры (Shared pointer) }; +// Класс 2D текстуры +class Texture : public BaseTexture +{ + public: + Texture(GLuint type = TEX_AVAILABLE_COUNT, const std::string& filename = ""); // Загрузка текстуры с диска или использование "пустой" + Texture(GLuint width, GLuint height, GLuint attachment, GLuint texType = TEX_DIFFUSE, GLint internalformat = GL_RGBA, GLint format = GL_RGBA, GLenum dataType = GL_FLOAT); // Конструктор текстуры заданного размера для использования в буфере + Texture(const Texture& other); // Конструктор копирования + + Texture& operator=(const Texture& other); // Оператор присваивания + + void reallocate(GLuint width, GLuint height, GLuint texType = TEX_DIFFUSE, GLint internalformat = GL_RGBA, GLint format = GL_RGBA, GLenum dataType = GL_FLOAT); // Пересоздает текстуру для имеющегося дескриптора + + virtual void use(); // Привязка текстуры +}; + #endif // TEXTURE_H diff --git a/src/Texture.cpp b/src/Texture.cpp index 311f7f3..e590ce7 100644 --- a/src/Texture.cpp +++ b/src/Texture.cpp @@ -3,12 +3,13 @@ #define STB_IMAGE_IMPLEMENTATION #include -std::map Texture::filename_handler; // Получение дескриптора текстуры по её имени -std::map Texture::handler_count; // Получение количества использований по дескриптору текстуры (Shared pointer) +std::map BaseTexture::filename_handler; // Получение дескриптора текстуры по её имени +std::map BaseTexture::handler_count; // Получение количества использований по дескриптору текстуры (Shared pointer) // Загрузка текстуры с диска или использование "пустой" -Texture::Texture(GLuint t, const std::string& filename) : type(t) +Texture::Texture(GLuint t, const std::string& filename) { + type = t; if (!filename_handler.count(filename)) { std::string empty = ""; @@ -60,8 +61,9 @@ Texture::Texture(GLuint t, const std::string& filename) : type(t) } // Конструктор текстуры заданного размера для использования в буфере -Texture::Texture(GLuint width, GLuint height, GLuint attachment, GLuint texType, GLint internalformat, GLint format, GLenum dataType) : type(texType) +Texture::Texture(GLuint width, GLuint height, GLuint attachment, GLuint texType, GLint internalformat, GLint format, GLenum dataType) { + type = texType; // Генерация текстуры заданного размера glGenTextures(1, &handler); glBindTexture(GL_TEXTURE_2D, handler); @@ -77,8 +79,10 @@ Texture::Texture(GLuint width, GLuint height, GLuint attachment, GLuint texType, } // Конструктор копирования -Texture::Texture(const Texture& other) : handler(other.handler), type(other.type) +Texture::Texture(const Texture& other) { + handler = other.handler; + type = other.type; // Делаем копию и увеличиваем счетчик handler_count[handler]++; } @@ -99,7 +103,7 @@ Texture& Texture::operator=(const Texture& other) return *this; } -Texture::~Texture() +BaseTexture::~BaseTexture() { if (!--handler_count[handler]) // Если количество ссылок = 0 { @@ -130,20 +134,20 @@ void Texture::use() } // Отвязка текстуры по типу -void Texture::disable(GLuint type) +void BaseTexture::disable(GLuint type) { glActiveTexture(type + GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, 0); // Отвязка текстуры } // Возвращает тип текстуры -GLuint Texture::getType() +GLuint BaseTexture::getType() { return type; } // Задает тип текстуры -void Texture::setType(GLuint type) +void BaseTexture::setType(GLuint type) { this->type = type; }