#ifndef TEXTURE_H #define TEXTURE_H #include #include #include enum TexType { TEX_DIFFUSE, TEX_AMBIENT, TEX_SPECULAR, TEX_AVAILABLE_COUNT }; // Абстрактный класс базовой текстуры class BaseTexture { public: ~BaseTexture(); virtual void use() = 0; // Привязка текстуры static void disable(GLuint type); // Отвязка текстуры по типу GLuint getType(); // Возвращает тип текстуры void setType(GLuint type); // Задает тип текстуры 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(); // Привязка текстуры }; // Класс 3D текстуры class TextureArray : public BaseTexture { public: TextureArray(GLuint levels, GLuint width, GLuint height, GLuint attachment, GLuint texType = TEX_DIFFUSE, GLint internalformat = GL_RGBA, GLint format = GL_RGBA, GLenum dataType = GL_FLOAT); // Конструктор текстуры заданного размера для использования в буфере TextureArray(const TextureArray& other); // Конструктор копирования TextureArray& operator=(const TextureArray& other); // Оператор присваивания void reallocate(GLuint levels, GLuint width, GLuint height, GLuint texType = TEX_DIFFUSE, GLint internalformat = GL_RGBA, GLint format = GL_RGBA, GLenum dataType = GL_FLOAT); // Пересоздает текстуру для имеющегося дескриптора virtual void use(); // Привязка текстуры }; // Класс кубической текстуры class TextureCube : public BaseTexture { public: TextureCube(GLuint type = TEX_AVAILABLE_COUNT, const std::string (&filename)[6] = {""}); // Загрузка текстуры с диска или использование "пустой" TextureCube(GLuint width, GLuint height, GLuint attachment, GLuint texType = TEX_DIFFUSE, GLint internalformat = GL_RGBA, GLint format = GL_RGBA, GLenum dataType = GL_FLOAT); // Конструктор текстуры заданного размера для использования в буфере TextureCube(const TextureCube& other); // Конструктор копирования TextureCube& operator=(const TextureCube& 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(); // Привязка текстуры }; // Класс 3D кубической текстуры class TextureCubeArray : public BaseTexture { public: TextureCubeArray(GLuint levels, GLuint width, GLuint height, GLuint attachment, GLuint texType = TEX_DIFFUSE, GLint internalformat = GL_RGBA, GLint format = GL_RGBA, GLenum dataType = GL_FLOAT); // Конструктор текстуры заданного размера для использования в буфере TextureCubeArray(const TextureCubeArray& other); // Конструктор копирования TextureCubeArray& operator=(const TextureCubeArray& other); // Оператор присваивания void reallocate(GLuint levels, 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