Источник как часть сцены
This commit is contained in:
parent
3f9c3c3bb8
commit
cdcc729d16
|
@ -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]; // Массив данных по источникам света
|
||||||
};
|
};
|
||||||
|
|
|
@ -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; // Цвет
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue