#include "HydraLightSystem.h" #include "../../engine/HydraEngine.h" #include "../HydraECS.h" #include "../components/HydraLightComponent.h" #include "../components/HydraPositionComponent.h" #include "../../buffer/HydraLightBufferManager.h" #include "../../buffer/HydraLightBuffer.h" #include "../../scheduler/HydraTaskScheduler.h" #include "../../task/buffer/HydraCreateGPUBufferTask.hpp" #include "../../task/buffer/HydraUpdatePartialGPUBufferTask.hpp" #include "../../actor/HydraActorManager.h" #include void HydraLightSystem::Initialise() { HydraTaskScheduler *task_scheduler = GetEngine()->TaskScheduler(); HydraID create_gpu_buffer_task_id = task_scheduler->CreateTask(HydraThreadAffinity::Render); HydraCreateGPUBufferTask *task = static_cast(task_scheduler->GetTask(create_gpu_buffer_task_id)); task->Intialise("LightBuffer", 1, MAX_LIGHTS * sizeof(HydraLightComponent), &m_light_buffer_id, HYDRA_BUFFER_TYPE::HYDRA_SSBO_BUFFER); task_scheduler->WaitForTask(create_gpu_buffer_task_id); } uint32_t HydraLightSystem::GetLightCount() { return m_lights.size(); } void HydraLightSystem::InitialiseComponent(HydraID entity_id) { HydraLightBufferManager *light_man = GetEngine()->LightBufferManager(); uint32_t light_count = light_man->GetLightCount(); HydraECS *ecs = GetEngine()->ECS(); HydraPositionComponent &pos_comp = ecs->GetComponent(entity_id); HydraLightComponent &light_comp = ecs->GetComponent(entity_id); m_lights.push_back(light_comp); } void HydraLightSystem::UpdateSystem(float delta_t_seconds) { _WriteToGPU(); } void HydraLightSystem::_WriteToGPU() { void *buffer = static_cast(m_lights.data()); HydraTaskScheduler *task_scheduler = GetEngine()->TaskScheduler(); HydraID update_buffer_task_id = task_scheduler->CreateTask(HydraThreadAffinity::Render); HydraUpdatePartialGPUBufferTask *task = static_cast(task_scheduler->GetTask(update_buffer_task_id)); task->Intialise(m_light_buffer_id, 0, sizeof(HydraLightComponent) * m_lights.size(), buffer); task_scheduler->WaitForTask(update_buffer_task_id); }