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