Класс абстрактной текстуры
This commit is contained in:
		
							parent
							
								
									f170913ea0
								
							
						
					
					
						commit
						9f02ec2daf
					
				@ -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<std::string, int> filename_handler; // Получение дескриптора текстуры по её имени
 | 
			
		||||
        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
 | 
			
		||||
 | 
			
		||||
@ -3,12 +3,13 @@
 | 
			
		||||
#define STB_IMAGE_IMPLEMENTATION
 | 
			
		||||
#include <stb_image.h>
 | 
			
		||||
 | 
			
		||||
std::map<std::string, int> Texture::filename_handler; // Получение дескриптора текстуры по её имени
 | 
			
		||||
std::map<int, int> Texture::handler_count; // Получение количества использований по дескриптору текстуры (Shared pointer)
 | 
			
		||||
std::map<std::string, int> BaseTexture::filename_handler; // Получение дескриптора текстуры по её имени
 | 
			
		||||
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))
 | 
			
		||||
    {
 | 
			
		||||
        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;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user