From cdcc729d168fc4e8257794c96c5a140af585d954 Mon Sep 17 00:00:00 2001 From: "re.kovalev" Date: Tue, 24 Oct 2023 16:02:29 +0300 Subject: [PATCH] =?UTF-8?q?=D0=98=D1=81=D1=82=D0=BE=D1=87=D0=BD=D0=B8?= =?UTF-8?q?=D0=BA=20=D0=BA=D0=B0=D0=BA=20=D1=87=D0=B0=D1=81=D1=82=D1=8C=20?= =?UTF-8?q?=D1=81=D1=86=D0=B5=D0=BD=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/Lights.h | 17 +++++++++++++++-- src/Lights.cpp | 44 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 2 deletions(-) diff --git a/include/Lights.h b/include/Lights.h index 189ede4..978b58f 100644 --- a/include/Lights.h +++ b/include/Lights.h @@ -3,7 +3,7 @@ #include -#include "Buffers.h" +#include "Model.h" // Максимальное число источников света #define MAX_LIGHTS 300 @@ -16,12 +16,25 @@ struct LightData }; // Источник света -class Light +class Light : public Node { public: static int getUBOsize(); // Возвращает размер буфера в байтах static void upload(UBO& lights_data); // Загрузка данных в буфер + const glm::vec3& c_color() const; // Константный доступ к цвету + glm::vec3& e_color(); // Неконстантная ссылка для изменений цвета + private: + glm::vec3 color; // Цвет + + int index; // Индекс в массиве отправки (может не совпадать с lights) для дефрагментированного доступа + + bool uploadReq; // Необходимость загрузки в следствии изменений + void check_id(); // Проверка что не взаимодествуем с пустым источником + void toData(); // Преобразует информацию об источнике в структуру LightData + + virtual void recalcMatrices(); // Метод пересчета матрицы трансформации по необходимости, должен сбрасывать флаг changed + static GLuint count; // количество используемых источников (должно быть <= MAX_LIGHTS) static LightData data[MAX_LIGHTS]; // Массив данных по источникам света }; diff --git a/src/Lights.cpp b/src/Lights.cpp index f1e2e2e..df9b26a 100644 --- a/src/Lights.cpp +++ b/src/Lights.cpp @@ -1,5 +1,7 @@ #include "Lights.h" +#include + GLuint Light::count = 0; // количество используемых источников (должно быть <= MAX_LIGHTS) LightData Light::data[MAX_LIGHTS]; // Массив данных по источникам света @@ -20,3 +22,45 @@ void Light::upload(UBO& lights_data) // Загружаем кол-во источников lights_data.loadSub(&count, sizeof(count), LightDataSize*MAX_LIGHTS); } + +// Метод пересчета матрицы трансформации по необходимости, должен сбрасывать флаг changed +void Light::recalcMatrices() +{ + // Если были изменения - необходимо загрузить данные + if (changed || parent_changed) + uploadReq = true; + + // Выполняем вычисление матриц методом родительского класса + Node::recalcMatrices(); +} + +// Константный доступ к цвету +const glm::vec3& Light::c_color() const +{ + return color; +} + +// Неконстантная ссылка для изменений цвета +glm::vec3& Light::e_color() +{ + uploadReq = true; + + return color; +} + +// Проверка что не взаимодествуем с пустым источником +void Light::check_id() +{ + if (index < 0 + || index >= count) + throw std::runtime_error("Попытка использовать ссылку на пустой или некорректный источник"); +} + +// Преобразует информацию об источнике в структуру LightData +void Light::toData() +{ + check_id(); // Проверка на работу с корректным индексом + + data[index].position = glm::vec3(result_transform[3]); // Позиция из матрицы трансформации + data[index].color = color; // Цвет +}