Point lights

This commit is contained in:
Confideo-IOM
2026-08-28 16:36:25 +01:00
parent 30538ae7ab
commit e3d37e3f8a
60 changed files with 458 additions and 184 deletions
@@ -50,7 +50,6 @@ void HydraLightBufferManager::AddLight(HydraLightComponent light)
{
return;
}
auto it = std::find(m_light_lookup.begin(), m_light_lookup.end(), light.entity_id);
if(it == m_light_lookup.end())
@@ -7,7 +7,7 @@
struct HydraMaterialBuffer
{
glm::vec4 diffuse_colour = {0, 0, 0, 0}; //0 - 16
glm::vec4 metalic_rough = {0, 0, 0, 0}; //28 - 12
glm::vec4 emmissive_metalic_rough = {0, 0, 0, 0}; //28 - 12
uint32_t diffuse_texture_id = INVALID_HYDRA_ID; //32 - 4
uint32_t metallic_rough_texture_id = INVALID_HYDRA_ID; //36 - 4
uint32_t normal_texture_id = INVALID_HYDRA_ID; //40 - 4
@@ -1,4 +1,16 @@
#include "HydraMaterialBufferManager.h"
#include "../engine/HydraEngine.h"
#include "../ecs/HydraECS.h"
#include "../ecs/components/HydraMaterialComponent.h"
#include "../buffer/HydraMaterialBufferManager.h"
#include "../buffer/HydraTextureBufferManager.h"
#include "../scheduler/HydraTaskScheduler.h"
#include "../task/buffer/HydraCreateGPUBufferTask.hpp"
#include "../task/buffer/HydraDeleteGPUBufferTask.hpp"
#include "../task/buffer/HydraUpdateWholeGPUBufferTask.hpp"
#include "../actor/HydraActorManager.h"
void HydraMaterialBufferManager::Intialise()
{
@@ -7,10 +19,33 @@ void HydraMaterialBufferManager::Intialise()
{
m_available_material_ids.push(mat_idx);
}
HydraTaskScheduler *task_scheduler = GetEngine()->TaskScheduler();
HydraID create_gpu_buffer_task_id = task_scheduler->CreateTask<HydraCreateGPUBufferTask>(HydraThreadAffinity::Render);
HydraCreateGPUBufferTask *task = static_cast<HydraCreateGPUBufferTask *>(task_scheduler->GetTask(create_gpu_buffer_task_id));
task->Intialise("MaterialBuffer", 1, MAX_MATERIALS * sizeof(HydraMaterialBuffer), &m_material_buffer_id, HYDRA_BUFFER_TYPE::HYDRA_SSBO_BUFFER);
task_scheduler->WaitForTask(create_gpu_buffer_task_id);
create_gpu_buffer_task_id = task_scheduler->CreateTask<HydraCreateGPUBufferTask>(HydraThreadAffinity::Render);
task = static_cast<HydraCreateGPUBufferTask *>(task_scheduler->GetTask(create_gpu_buffer_task_id));
task->Intialise("TextureBuffer", 1, MAX_TEXTURES * sizeof(uint64_t), &m_texture_buffer_id, HYDRA_BUFFER_TYPE::HYDRA_SSBO_BUFFER);
task_scheduler->WaitForTask(create_gpu_buffer_task_id);
}
void HydraMaterialBufferManager::Shutdown()
{
HydraTaskScheduler *task_scheduler = GetEngine()->TaskScheduler();
HydraID delete_gpu_buffer_task_id = task_scheduler->CreateTask<HydraDeleteGPUBufferTask>(HydraThreadAffinity::Render);
HydraDeleteGPUBufferTask *task = static_cast<HydraDeleteGPUBufferTask *>(task_scheduler->GetTask(delete_gpu_buffer_task_id));
task->Intialise(m_material_buffer_id);
task_scheduler->WaitForTask(delete_gpu_buffer_task_id);
delete_gpu_buffer_task_id = task_scheduler->CreateTask<HydraDeleteGPUBufferTask>(HydraThreadAffinity::Render);
task = static_cast<HydraDeleteGPUBufferTask *>(task_scheduler->GetTask(delete_gpu_buffer_task_id));
task->Intialise(m_texture_buffer_id);
task_scheduler->WaitForTask(delete_gpu_buffer_task_id);
}
HydraID HydraMaterialBufferManager::CreateMaterial(const HydraMaterialBuffer &material)
@@ -26,10 +61,35 @@ HydraID HydraMaterialBufferManager::CreateMaterial(const HydraMaterialBuffer &ma
return mat_id;
}
void HydraMaterialBufferManager::DeleteMaterial(HydraID material_id)
{
std::lock_guard<std::mutex> lock(m_mutex);
if(material_id < MAX_MATERIALS)
{
m_material[material_id] = {};
m_available_material_ids.push(material_id);
}
}
void *HydraMaterialBufferManager::GetMaterialBuffer()
{
return &m_material[0];
}
void HydraMaterialBufferManager::UpdateBuffer()
{
void* buffer = GetEngine()->MaterialBufferManager()->GetMaterialBuffer();
HydraTaskScheduler *task_scheduler = GetEngine()->TaskScheduler();
HydraID update_buffer_task_id = task_scheduler->CreateTask<HydraUpdateWholeGPUBufferTask>(HydraThreadAffinity::Render);
HydraUpdateWholeGPUBufferTask *task = static_cast<HydraUpdateWholeGPUBufferTask *>(task_scheduler->GetTask(update_buffer_task_id));
task->Intialise(m_material_buffer_id, buffer);
task_scheduler->WaitForTask(update_buffer_task_id);
buffer = GetEngine()->TextureBufferManager()->GetTextureBuffer();
update_buffer_task_id = task_scheduler->CreateTask<HydraUpdateWholeGPUBufferTask>(HydraThreadAffinity::Render);
task = static_cast<HydraUpdateWholeGPUBufferTask *>(task_scheduler->GetTask(update_buffer_task_id));
task->Intialise(m_texture_buffer_id, buffer);
task_scheduler->WaitForTask(update_buffer_task_id);
}
@@ -19,9 +19,12 @@ class HydraMaterialBufferManager : public HydraObject
void Intialise();
void Shutdown();
HydraID CreateMaterial(const HydraMaterialBuffer& material);
void DeleteMaterial(HydraID material_id);
void* GetMaterialBuffer();
void UpdateBuffer();
private:
uint32_t m_material_buffer_id =0;
uint32_t m_texture_buffer_id =0;
std::mutex m_mutex;
std::queue<HydraID> m_available_material_ids;
std::vector<HydraMaterialBuffer> m_material;