Источник как часть сцены

This commit is contained in:
parent 3f9c3c3bb8
commit cdcc729d16
2 changed files with 59 additions and 2 deletions

View File

@ -3,7 +3,7 @@
#include <GLM/glm.hpp> #include <GLM/glm.hpp>
#include "Buffers.h" #include "Model.h"
// Максимальное число источников света // Максимальное число источников света
#define MAX_LIGHTS 300 #define MAX_LIGHTS 300
@ -16,12 +16,25 @@ struct LightData
}; };
// Источник света // Источник света
class Light class Light : public Node
{ {
public: public:
static int getUBOsize(); // Возвращает размер буфера в байтах static int getUBOsize(); // Возвращает размер буфера в байтах
static void upload(UBO& lights_data); // Загрузка данных в буфер 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 GLuint count; // количество используемых источников (должно быть <= MAX_LIGHTS)
static LightData data[MAX_LIGHTS]; // Массив данных по источникам света static LightData data[MAX_LIGHTS]; // Массив данных по источникам света
}; };

View File

@ -1,5 +1,7 @@
#include "Lights.h" #include "Lights.h"
#include <stdexcept>
GLuint Light::count = 0; // количество используемых источников (должно быть <= MAX_LIGHTS) GLuint Light::count = 0; // количество используемых источников (должно быть <= MAX_LIGHTS)
LightData Light::data[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); 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; // Цвет
}