#include "Buffers.h" // Счетчики использований дескрипторов std::map VAO::handler_count; std::map BO::handler_count; // Создает VAO и активирует его VAO::VAO() { glGenVertexArrays(1, &handler); // Генерация одного объекта массива вершин glBindVertexArray(handler); // Привязка для использования handler_count[handler] = 1; // Инициализация счетчика для дескриптора } // Уничтожает VAO VAO::~VAO() { // Если дескриптор никем не используется - освободим его if (!--handler_count[handler]) { glDeleteVertexArrays(1, &handler); handler_count.erase(handler); // Удаление из словаря } } // Конструктор копирования VAO::VAO(const VAO & copy) : handler(copy.handler) { handler_count[handler]++; } // Оператор присваивания VAO& VAO::operator=(const VAO & other) { // Если это разные дескрипторы if (handler != other.handler) { // то следуюет удалить текущий перед заменой this->~VAO(); handler = other.handler; handler_count[handler]++; } return *this; } // Активация VAO void VAO::use() { glBindVertexArray(handler); // Привязка VAO для использования } // Деактивация активного VAO void VAO::disable() { glBindVertexArray(0); // Отключение VAO } // Создает пустой буфер заданного типа BO::BO(BUFFER_TYPE t) : type(t) { glGenBuffers(1, &handler); // Генерация одного объекта буфера handler_count[handler] = 1; use(); // Привязка буфера } // Создает и загружает туда данные BO::BO(BUFFER_TYPE t, const void *data, int size) : BO(t) { load(data, size); } // Уничтожает буфер BO::~BO() { if (handler) // Если буфер был создан { // Если дескриптор никем не используется - освободим его if (!--handler_count[handler]) { glDeleteBuffers(1, &handler); handler_count.erase(handler); // Удаление из словаря } handler = 0; } } // Конструктор копирования BO::BO(const BO & copy) : handler(copy.handler), type(copy.type) { handler_count[handler]++; } // Оператор присваивания BO& BO::operator=(const BO & other) { // Если это разные дескрипторы if (handler != other.handler) { // то следуюет удалить текущий перед заменой this->~BO(); handler = other.handler; handler_count[handler]++; } // Изменим тип type = other.type; return *this; } // Загрузка вершин в буфер void BO::load(const void *data, int size, GLuint mode) { use(); // Привязка буфера glBufferData(type, size, data, mode); } void BO::use() { glBindBuffer(type, handler); // Привязка элементного буфера }