Light tweeks

This commit is contained in:
Confideo-IOM
2026-08-17 14:12:11 +01:00
parent 98ff54c106
commit 139fb149b2
55 changed files with 593 additions and 265 deletions
@@ -18,6 +18,8 @@
#include "../../task/renderer/HydraCreateCascadeShadowFrameBuffer.hpp"
#include "../../task/renderer/HydraCreateShadowFrameBuffer.hpp"
#include "../../actor/HydraActorManager.h"
#include "../../actor/HydraTestCubeActor.h"
void HydraDirectionalShadowSourceSystem::Initialise()
{
@@ -41,6 +43,9 @@ void HydraDirectionalShadowSourceSystem::InitialiseComponent(HydraID entity_id)
shadow_comp.shadow_id = shadow_id;
_InitialiseShadowMap(entity_id);
// m_shadow_actor_id = GetEngine()->ActorManager()->CreateActor<HydraTestCubeActor>();
// GetEngine()->ActorManager()->InitialiseActor(m_shadow_actor_id);
// GetEngine()->ActorManager()->SetPosition(m_shadow_actor_id, glm::dvec3(0, 0, 0));
}
void HydraDirectionalShadowSourceSystem::UpdateSystem(float delta_t_seconds)
@@ -58,39 +63,43 @@ void HydraDirectionalShadowSourceSystem::_UpdateShadowMap(HydraID entity_id)
HydraPositionComponent pos_comp = ecs->GetComponent<HydraPositionComponent>(entity_id);
HydraDirectionalShadowSourceComponent &shad_comp = ecs->GetComponent<HydraDirectionalShadowSourceComponent>(entity_id);
float view_size = 4.0f;
float view_near = 0.1f;
float view_far = 4.0f;
float view_size = 4.0f;
float shadow_distance = 4.0f;
float max_shadow_range = 100000.0f;
glm::mat4 light_rot = glm::eulerAngleXYZ(pos_comp.orientation.x, pos_comp.orientation.y, pos_comp.orientation.z);
glm::vec3 light_dir = glm::normalize(glm::vec3(light_rot * glm::vec4(0.0f, 0.0f, -1.0f, 0.0f)));
glm::vec3 camera_pos = GetEngine()->Camera()->GetPosition();
glm::vec3 light_pos = (camera_pos - (light_dir * 1000.0f));
glm::vec3 target_pos = light_pos + light_dir;
glm::vec3 up_vector = glm::vec3(0.0f, 1.0f, 0.0f);
if (glm::abs(glm::dot(light_dir, up_vector)) > 0.99f)
{
up_vector = glm::vec3(1.0f, 0.0f, 0.0f); // Prevent gimbal lock
}
glm::mat4 view = glm::lookAt(light_pos, target_pos, up_vector);
for (uint32_t i = 0; i < 6; i++)
{
glm::vec3 light_pos = camera_pos;//- (light_dir * 2.0f);
glm::vec3 target_pos = light_pos + light_dir;
glm::vec3 up_vector = glm::vec3(0.0f, 1.0f, 0.0f);
float view_near = 0.1f;//max_shadow_range - shadow_distance;
float view_far = 2000.0f;// max_shadow_range + shadow_distance;
if (glm::abs(glm::dot(light_dir, up_vector)) > 0.99f)
{
up_vector = glm::vec3(1.0f, 0.0f, 0.0f); // Prevent gimbal lock
}
glm::mat4 view = glm::lookAt(light_pos, target_pos, up_vector);
glm::mat4 proj = glm::ortho(-view_size, view_size, -view_size, view_size, view_near, view_far);
// Save data to component
shad_comp.far_plane[i] = view_far;
shad_comp.near_plane[i] = view_near;
shad_comp.far_plane[i] = shadow_distance;
shad_comp.near_plane[i] = 0;
shad_comp.light_space_proj[i] = proj;
shad_comp.light_space_view[i] = view;
// Scale bounds exponentially for the next cascade tier
view_size *= 3.0f;
view_far *= 3.0f;
shadow_distance *= 3.0f;
}
// GetEngine()->ActorManager()->SetPosition(m_shadow_actor_id, light_pos);
// GetEngine()->ActorManager()->SetOrientation(m_shadow_actor_id, pos_comp.orientation.x, pos_comp.orientation.y, pos_comp.orientation.z);
GetEngine()->ShadowBufferManager()->UpdateDirectionalShadow(shad_comp.shadow_id, shad_comp);
}
@@ -18,6 +18,7 @@ class HydraDirectionalShadowSourceSystem : public HydraSystem
private:
void _UpdateShadowMap(HydraID entity_id);
void _InitialiseShadowMap(HydraID entity_id);
HydraID m_shadow_actor_id = INVALID_HYDRA_ID;
std::mutex m_mutex;
};
@@ -40,5 +40,5 @@ void HydraMeshSystem::InitialiseComponent(HydraID entity_id)
HydraUpdateVertexBufferTask *vertex_update_task = static_cast<HydraUpdateVertexBufferTask *>(task_scheduler->GetTask(update_buffer_task_id));
vertex_update_task->Intialise(mesh_comp.vertex_buffer_id, &mesh->vertexes[0], &mesh->indexes[0]);
task_scheduler->WaitForTask(update_buffer_task_id);
mesh_comp.mesh_state = HYDRA_STATE::Ready;
}
@@ -63,8 +63,8 @@ void HydraPointShadowSourceSystem::_UpdateShadowMap(HydraID entity_id)
glm::vec3 camera_pos = GetEngine()->Camera()->GetPosition();
float aspect = (float)SHADOW_MAP_SIZE/(float)SHADOW_MAP_SIZE;
float width = SHADOW_MAP_SIZE;
float aspect = (float)POINT_SHADOW_MAP_SIZE/(float)POINT_SHADOW_MAP_SIZE;
float width = POINT_SHADOW_MAP_SIZE;
float fov = glm::radians(90.0f);
glm::mat4 shadow_proj = glm::perspectiveFovLH<float>(fov, width, width, view_near, view_far);