Класс абстрактной текстуры

This commit is contained in:
parent f170913ea0
commit 9f02ec2daf
2 changed files with 33 additions and 21 deletions

View File

@ -13,27 +13,35 @@ enum TexType {
TEX_AVAILABLE_COUNT TEX_AVAILABLE_COUNT
}; };
class Texture // Абстрактный класс базовой текстуры
class BaseTexture
{ {
public: public:
Texture(GLuint type = TEX_AVAILABLE_COUNT, const std::string& filename = ""); // Загрузка текстуры с диска или использование "пустой" ~BaseTexture();
Texture(GLuint width, GLuint height, GLuint attachment, GLuint texType = TEX_DIFFUSE, GLint internalformat = GL_RGBA, GLint format = GL_RGBA, GLenum dataType = GL_FLOAT); // Конструктор текстуры заданного размера для использования в буфере virtual void use() = 0; // Привязка текстуры
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(); // Привязка текстуры
static void disable(GLuint type); // Отвязка текстуры по типу static void disable(GLuint type); // Отвязка текстуры по типу
GLuint getType(); // Возвращает тип текстуры GLuint getType(); // Возвращает тип текстуры
void setType(GLuint type); // Задает тип текстуры void setType(GLuint type); // Задает тип текстуры
private: protected:
GLuint handler; // Дескриптор текстуры GLuint handler; // Дескриптор текстуры
GLuint type; // Тип текстуры, соответствует её слоту GLuint type; // Тип текстуры, соответствует её слоту
static std::map<std::string, int> filename_handler; // Получение дескриптора текстуры по её имени static std::map<std::string, int> filename_handler; // Получение дескриптора текстуры по её имени
static std::map<int, int> handler_count; // Получение количества использований по дескриптору текстуры (Shared pointer) static std::map<int, int> 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 #endif // TEXTURE_H

View File

@ -3,12 +3,13 @@
#define STB_IMAGE_IMPLEMENTATION #define STB_IMAGE_IMPLEMENTATION
#include <stb_image.h> #include <stb_image.h>
std::map<std::string, int> Texture::filename_handler; // Получение дескриптора текстуры по её имени std::map<std::string, int> BaseTexture::filename_handler; // Получение дескриптора текстуры по её имени
std::map<int, int> Texture::handler_count; // Получение количества использований по дескриптору текстуры (Shared pointer) std::map<int, int> 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)) if (!filename_handler.count(filename))
{ {
std::string empty = ""; 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); glGenTextures(1, &handler);
glBindTexture(GL_TEXTURE_2D, 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]++; handler_count[handler]++;
} }
@ -99,7 +103,7 @@ Texture& Texture::operator=(const Texture& other)
return *this; return *this;
} }
Texture::~Texture() BaseTexture::~BaseTexture()
{ {
if (!--handler_count[handler]) // Если количество ссылок = 0 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); glActiveTexture(type + GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, 0); // Отвязка текстуры glBindTexture(GL_TEXTURE_2D, 0); // Отвязка текстуры
} }
// Возвращает тип текстуры // Возвращает тип текстуры
GLuint Texture::getType() GLuint BaseTexture::getType()
{ {
return type; return type;
} }
// Задает тип текстуры // Задает тип текстуры
void Texture::setType(GLuint type) void BaseTexture::setType(GLuint type)
{ {
this->type = type; this->type = type;
} }