Дефрагментация данных по источникам
This commit is contained in:
@@ -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()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user