Дефрагментация данных по источникам
This commit is contained in:
parent
cdcc729d16
commit
1866027900
|
@ -22,12 +22,21 @@ class Light : public Node
|
|||
static int getUBOsize(); // Возвращает размер буфера в байтах
|
||||
static void upload(UBO& lights_data); // Загрузка данных в буфер
|
||||
|
||||
static Light& getNew(); // Возвращает ссылку на новый источник света
|
||||
void destroy(); // Уничтожает источник света
|
||||
|
||||
const glm::vec3& c_color() const; // Константный доступ к цвету
|
||||
glm::vec3& e_color(); // Неконстантная ссылка для изменений цвета
|
||||
private:
|
||||
Light(); // Конструктор без параметров
|
||||
Light(const Light& copy) = delete; // Конструктор копирования ОТКЛЮЧЕН
|
||||
Light& operator=(const Light& other); // Оператор присваивания
|
||||
virtual ~Light();
|
||||
|
||||
glm::vec3 color; // Цвет
|
||||
|
||||
int index; // Индекс в массиве отправки (может не совпадать с lights) для дефрагментированного доступа
|
||||
static Light& findByIndex(GLuint index); // Возвращает ссылку на источник с нужным индексом
|
||||
|
||||
bool uploadReq; // Необходимость загрузки в следствии изменений
|
||||
void check_id(); // Проверка что не взаимодествуем с пустым источником
|
||||
|
@ -37,6 +46,7 @@ class Light : public Node
|
|||
|
||||
static GLuint count; // количество используемых источников (должно быть <= MAX_LIGHTS)
|
||||
static LightData data[MAX_LIGHTS]; // Массив данных по источникам света
|
||||
static Light lights[MAX_LIGHTS]; // Массив источников-узлов сцены
|
||||
};
|
||||
|
||||
#endif // LIGHTS_H
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
|
||||
GLuint Light::count = 0; // количество используемых источников (должно быть <= MAX_LIGHTS)
|
||||
LightData Light::data[MAX_LIGHTS]; // Массив данных по источникам света
|
||||
Light Light::lights[MAX_LIGHTS]; // Массив источников-узлов сцены
|
||||
|
||||
// возвращает размер буфера в байтах
|
||||
int Light::getUBOsize()
|
||||
|
@ -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()
|
||||
{
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue