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; // Цвет +}