Directional Shdaows, no alpha

This commit is contained in:
Confideo-IOM
2026-08-03 22:34:52 +01:00
parent 299ad1d9c7
commit d074dc71a5
69 changed files with 1353 additions and 406 deletions
@@ -15,6 +15,10 @@ struct HydraLightComponent
float cutoff_outer = 0.75f;
HydraID entity_id;
uint32_t light_type;
uint32_t shadow_map_id = 0;
uint32_t shadow_caster = 0;
uint32_t padding0;
uint32_t padding1;
};
#endif /* HYDRAECSLIGHTCOMPONENT */
@@ -21,6 +21,13 @@ void HydraShadowSourceSystem::Initialise()
{
HydraTaskScheduler *task_scheduler = GetEngine()->TaskScheduler();
for(uint32_t i = 0; i < MAX_SHADOWS; i++)
{
m_available_shadows.push(i);
}
m_shadows.resize(MAX_SHADOWS);
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("ShadowBuffer", 1, MAX_SHADOWS * sizeof(HydraShadowSourceComponent), &m_shadow_buffer_id, HYDRA_BUFFER_TYPE::HYDRA_SSBO_BUFFER);
@@ -32,6 +39,16 @@ void HydraShadowSourceSystem::InitialiseComponent(HydraID entity_id)
HydraEngine *engine = GetEngine();
HydraECS *ecs = engine->ECS();
HydraLightComponent &light_comp = ecs->GetComponent<HydraLightComponent>(entity_id);
{
std::lock_guard<std::mutex> lock(m_mutex);
assert(m_available_shadows.size() > 0 && "Run out of shadows");
uint32_t shad_id = m_available_shadows.front();
m_available_shadows.pop();
light_comp.shadow_map_id = shad_id;
light_comp.shadow_caster = 1;
}
switch (light_comp.light_type)
{
case (int)HYDRA_LIGHT_TYPE::HYDRA_LIGHT_DIRECTIONAL:
@@ -57,9 +74,9 @@ void HydraShadowSourceSystem::UpdateSystem(float delta_t_seconds)
}
HydraShadowSourceComponent shad_comp = ecs->GetComponent<HydraShadowSourceComponent>(entity_id);
shadows.push_back(shad_comp);
m_shadows[light_comp.shadow_map_id] = shad_comp;
}
_WriteToGPU(shadows);
_WriteToGPU();
}
void HydraShadowSourceSystem::_UpdateDirectionalLight(HydraID entity_id)
@@ -69,30 +86,31 @@ void HydraShadowSourceSystem::_UpdateDirectionalLight(HydraID entity_id)
HydraPositionComponent pos_comp = ecs->GetComponent<HydraPositionComponent>(entity_id);
HydraShadowSourceComponent &shad_comp = ecs->GetComponent<HydraShadowSourceComponent>(entity_id);
float view_size = 5.0f;
float view_near = -5.0f;
float view_far = 5.0f;
float view_size = 20.0f;
float view_near = -10.0f;
float view_far = 10.0f;
float PI = 3.1415927;
float TWO_PI = 6.2831854;
glm::vec3 light_dir = glm::vec3(0, 0, -1);
glm::vec3 light_dir = glm::vec3(0, 0, -1);
glm::mat3 light_rot = glm::mat3(1);
glm::vec3 light_euler = pos_comp.orientation;
glm::vec3 light_euler = pos_comp.orientation * glm::vec3(-1,-1,-1);
light_rot = glm::eulerAngleXYZ(light_euler.x, light_euler.y, light_euler.z);
light_dir = light_rot * light_dir;
light_dir = glm::normalize(light_dir);
glm::vec3 camera_pos = GetEngine()->Camera()->GetPosition();
float light_distance = 2;
for (uint32_t i = 0; i < 6; i++)
{
glm::vec3 light_pos = camera_pos; // - (light_dir * light_distance);
glm::vec3 light_pos = camera_pos - (light_dir * light_distance);
glm::mat4 light_trans = glm::translate(light_pos * glm::vec3(-1, -1, -1));
glm::mat4 light_trans = glm::translate(light_pos * glm::vec3(-1, 1, -1));
glm::mat4 light_orient = glm::eulerAngleXYZ(light_euler.x, light_euler.y, light_euler.z);
glm::mat4 view = light_orient * light_trans;
glm::mat4 proj = glm::orthoRH<float>(view_size, -view_size, -view_size, view_size, -15000, 15000);
glm::mat4 proj = glm::ortho<float>(-view_size, view_size, view_size, -view_size, view_near, view_far);
shad_comp.far_plane[i] = view_far;
shad_comp.near_plane[i] = view_near;
@@ -116,22 +134,25 @@ void HydraShadowSourceSystem::_InitialiseDirectionalLight(HydraID entity_id)
HydraTaskScheduler *task_scheduler = GetEngine()->TaskScheduler();
uint32_t depth_texture_id = 0;
HydraID create_framebuffer_task_id = task_scheduler->CreateTask<HydraCreateShadowFrameBuffer>(HydraThreadAffinity::Render);
HydraCreateShadowFrameBuffer *fb_task = static_cast<HydraCreateShadowFrameBuffer *>(task_scheduler->GetTask(create_framebuffer_task_id));
fb_task->Initialise(&shad_comp.shadow_texture_id, &shad_comp.frame_buffer_id);
fb_task->Initialise(&shad_comp.shadow_texture_id, &depth_texture_id, &shad_comp.frame_buffer_id);
task_scheduler->WaitForTask(create_framebuffer_task_id);
shad_comp.shadow_texture_id = depth_texture_id;
}
void HydraShadowSourceSystem::_WriteToGPU(std::vector<HydraShadowSourceComponent> shadows)
void HydraShadowSourceSystem::_WriteToGPU()
{
HydraEngine *engine = GetEngine();
HydraECS *ecs = engine->ECS();
void *buffer = static_cast<void *>(shadows.data());
void *buffer = static_cast<void *>(m_shadows.data());
HydraTaskScheduler *task_scheduler = GetEngine()->TaskScheduler();
HydraID update_buffer_task_id = task_scheduler->CreateTask<HydraUpdatePartialGPUBufferTask>(HydraThreadAffinity::Render);
HydraUpdatePartialGPUBufferTask *task = static_cast<HydraUpdatePartialGPUBufferTask *>(task_scheduler->GetTask(update_buffer_task_id));
task->Intialise(m_shadow_buffer_id, 0, sizeof(HydraShadowSourceComponent) * shadows.size(), buffer);
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_shadow_buffer_id, buffer);
task_scheduler->WaitForTask(update_buffer_task_id);
}
@@ -5,6 +5,8 @@
#include "../components/HydraShadowSourceComponent.h"
#include <GLMIncludes.h>
#include <queue>
#include <vector>
#include <mutex>
class HydraShadowSourceSystem : public HydraSystem
{
@@ -16,9 +18,11 @@ class HydraShadowSourceSystem : public HydraSystem
private:
void _UpdateDirectionalLight(HydraID entity_id);
void _InitialiseDirectionalLight(HydraID entity_id);
void _WriteToGPU(std::vector<HydraShadowSourceComponent> shadows);
HydraID m_shadow_buffer_id = INVALID_HYDRA_ID;
void _WriteToGPU();
HydraID m_shadow_buffer_id = INVALID_HYDRA_ID;
std::queue<HydraID> m_available_shadows;
std::vector<HydraShadowSourceComponent> m_shadows;
std::mutex m_mutex;
};