From 18660279000fb878af11822fa209b6196089a57a Mon Sep 17 00:00:00 2001 From: "re.kovalev" Date: Tue, 24 Oct 2023 17:14:52 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=B5=D1=84=D1=80=D0=B0=D0=B3=D0=BC?= =?UTF-8?q?=D0=B5=D0=BD=D1=82=D0=B0=D1=86=D0=B8=D1=8F=20=D0=B4=D0=B0=D0=BD?= =?UTF-8?q?=D0=BD=D1=8B=D1=85=20=D0=BF=D0=BE=20=D0=B8=D1=81=D1=82=D0=BE?= =?UTF-8?q?=D1=87=D0=BD=D0=B8=D0=BA=D0=B0=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/Lights.h | 10 +++++++ src/Lights.cpp | 72 +++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 81 insertions(+), 1 deletion(-) diff --git a/include/Lights.h b/include/Lights.h index 978b58f..12f4cfc 100644 --- a/include/Lights.h +++ b/include/Lights.h @@ -22,12 +22,21 @@ class Light : public Node static int getUBOsize(); // Возвращает размер буфера в байтах static void upload(UBO& lights_data); // Загрузка данных в буфер + static Light& getNew(); // Возвращает ссылку на новый источник света + void destroy(); // Уничтожает источник света + const glm::vec3& c_color() const; // Константный доступ к цвету glm::vec3& e_color(); // Неконстантная ссылка для изменений цвета private: + Light(); // Конструктор без параметров + Light(const Light& copy) = delete; // Конструктор копирования ОТКЛЮЧЕН + Light& operator=(const Light& other); // Оператор присваивания + virtual ~Light(); + glm::vec3 color; // Цвет int index; // Индекс в массиве отправки (может не совпадать с lights) для дефрагментированного доступа + static Light& findByIndex(GLuint index); // Возвращает ссылку на источник с нужным индексом bool uploadReq; // Необходимость загрузки в следствии изменений void check_id(); // Проверка что не взаимодествуем с пустым источником @@ -37,6 +46,7 @@ class Light : public Node static GLuint count; // количество используемых источников (должно быть <= MAX_LIGHTS) static LightData data[MAX_LIGHTS]; // Массив данных по источникам света + static Light lights[MAX_LIGHTS]; // Массив источников-узлов сцены }; #endif // LIGHTS_H diff --git a/src/Lights.cpp b/src/Lights.cpp index df9b26a..dc32e82 100644 --- a/src/Lights.cpp +++ b/src/Lights.cpp @@ -4,6 +4,7 @@ GLuint Light::count = 0; // количество используемых источников (должно быть <= MAX_LIGHTS) LightData Light::data[MAX_LIGHTS]; // Массив данных по источникам света +Light Light::lights[MAX_LIGHTS]; // Массив источников-узлов сцены // возвращает размер буфера в байтах int Light::getUBOsize() @@ -15,7 +16,7 @@ int Light::getUBOsize() void Light::upload(UBO& lights_data) { GLuint LightDataSize = sizeof(LightData); // Одного экземпляра структуры LightData - + if (count) lights_data.loadSub(data, sizeof(LightData)*count); // Загрузка данных об источниках @@ -64,3 +65,72 @@ void Light::toData() data[index].position = glm::vec3(result_transform[3]); // Позиция из матрицы трансформации data[index].color = color; // Цвет } + +// Возвращает ссылку на новый источник света +Light& Light::getNew() +{ + Light& refNew = findByIndex(-1); + + refNew.index = count++; + refNew.uploadReq = true; + + return refNew; +} + +// Уничтожает источник света +void Light::destroy() +{ + check_id(); // Проверка на работу с корректным индексом + // Если удаляемый элемент не последний + if (count-1 != index) + { + // Найдем элемент для замены + Light& replace = findByIndex(--count); + + replace.uploadReq = true; // Требуется загрузить данные + replace.index = index; // Заменяем индекс данных + } + + operator=(Light()); // Обнулим источник путем замены на новый +} + +// Возвращает ссылку на источник с нужным индексом +Light& Light::findByIndex(GLuint index) +{ + // Если нет источников - возвращаем нулевой + if (!count) + return lights[0]; + + // Цикл по перебору источников + for (int i = 0; i < MAX_LIGHTS; i++) + if (lights[i].index == index) + return lights[i]; + + throw std::runtime_error("Запрашиваемый источник освещения не найден, либо достигнут лимит"); +} + +// Конструктор без параметров +Light::Light() : Node(), index(-1), uploadReq(false), color(1.0f) +{ + +} + +// Оператор присваивания +Light& Light::operator=(const Light& other) +{ + // Проверка на самоприсваивание + if (this != &other) + { + index = other.index; // Переносим индекс + uploadReq = other.uploadReq; // Необходимость загрузки + color = other.color; + + Node::operator=(other); + } + return *this; +} + +Light::~Light() +{ + +}