Point light working

This commit is contained in:
Confideo-IOM
2026-08-16 13:47:11 +01:00
parent f9b696f9e8
commit 98ff54c106
50 changed files with 1187 additions and 357 deletions
@@ -18,9 +18,14 @@ void HydraShadowBufferManager::Initialise()
{
m_available_spot.push(i);
}
for(uint32_t i = 0; i < MAX_POINT_SHADOWS; i++)
{
m_available_point.push(i);
}
m_directional_shadow_buffer.resize(MAX_DIRECTIONAL_SHADOWS);
m_spot_shadow_buffer.resize(MAX_SPOT_SHADOWS);
m_point_shadow_buffer.resize(MAX_POINT_SHADOWS);
uint32_t buffer_size = (MAX_DIRECTIONAL_SHADOWS * sizeof(HydraDirectionalShadowSourceComponent));
@@ -35,10 +40,17 @@ void HydraShadowBufferManager::Initialise()
HydraCreateGPUBufferTask *spot_task = static_cast<HydraCreateGPUBufferTask *>(task_scheduler->GetTask(create_gpu_buffer_task_id));
spot_task->Intialise("SpotShadowBuffer", 1, buffer_size, &m_spot_shadow_buffer_id, HYDRA_BUFFER_TYPE::HYDRA_SSBO_BUFFER);
task_scheduler->WaitForTask(create_gpu_buffer_task_id);
buffer_size = (MAX_POINT_SHADOWS * sizeof(HydraPointShadowSourceComponent));
create_gpu_buffer_task_id = task_scheduler->CreateTask<HydraCreateGPUBufferTask>(HydraThreadAffinity::Render);
HydraCreateGPUBufferTask *point_task = static_cast<HydraCreateGPUBufferTask *>(task_scheduler->GetTask(create_gpu_buffer_task_id));
point_task->Intialise("PointShadowBuffer", 1, buffer_size, &m_point_shadow_buffer_id, HYDRA_BUFFER_TYPE::HYDRA_SSBO_BUFFER);
task_scheduler->WaitForTask(create_gpu_buffer_task_id);
}
void HydraShadowBufferManager::Shutdown()
{
}
HydraID HydraShadowBufferManager::AddDirectionalShadow(HydraDirectionalShadowSourceComponent shadow)
{
@@ -66,6 +78,19 @@ HydraID HydraShadowBufferManager::AddSpotShadow(HydraSpotShadowSourceComponent s
return shadow_id;
}
HydraID HydraShadowBufferManager::AddPointShadow(HydraPointShadowSourceComponent shadow)
{
std::lock_guard<std::mutex> lock(m_mutex);
if(m_available_point.size() == 0)
{
return INVALID_HYDRA_ID;
}
HydraID shadow_id = m_available_point.front();
m_point_shadow_buffer[shadow_id] = shadow;
return shadow_id;
}
void HydraShadowBufferManager::UpdateDirectionalShadow(HydraID shadow_id, HydraDirectionalShadowSourceComponent shadow)
{
std::lock_guard<std::mutex> lock(m_mutex);
@@ -84,6 +109,15 @@ void HydraShadowBufferManager::UpdateSpotShadow(HydraID shadow_id, HydraSpotShad
}
}
void HydraShadowBufferManager::UpdatePointShadow(HydraID shadow_id, HydraPointShadowSourceComponent shadow)
{
std::lock_guard<std::mutex> lock(m_mutex);
if(shadow_id < MAX_SPOT_SHADOWS)
{
m_point_shadow_buffer[shadow_id] = shadow;
}
}
void HydraShadowBufferManager::RemoveDirectionalShadow(HydraID shadow_id)
{
@@ -93,6 +127,10 @@ void HydraShadowBufferManager::RemoveSpotShadow(HydraID shadow_id)
}
void HydraShadowBufferManager::RemovePointShadow(HydraID shadow_id)
{
}
void HydraShadowBufferManager::UpdateShadowBuffer()
{
HydraEngine *engine = GetEngine();
@@ -112,4 +150,11 @@ void HydraShadowBufferManager::UpdateShadowBuffer()
HydraUpdateWholeGPUBufferTask *spot_task = static_cast<HydraUpdateWholeGPUBufferTask *>(task_scheduler->GetTask(update_buffer_task_id));
spot_task->Intialise(m_spot_shadow_buffer_id, spot_buffer);
task_scheduler->WaitForTask(update_buffer_task_id);
void *point_buffer = static_cast<void *>(m_point_shadow_buffer.data());
update_buffer_task_id = task_scheduler->CreateTask<HydraUpdateWholeGPUBufferTask>(HydraThreadAffinity::Render);
HydraUpdateWholeGPUBufferTask *point_task = static_cast<HydraUpdateWholeGPUBufferTask *>(task_scheduler->GetTask(update_buffer_task_id));
point_task->Intialise(m_point_shadow_buffer_id, point_buffer);
task_scheduler->WaitForTask(update_buffer_task_id);
}