Cleaning up shutdown

This commit is contained in:
Confideo-IOM
2026-08-17 21:44:00 +01:00
parent 139fb149b2
commit 282243a16b
89 changed files with 2112 additions and 855 deletions
+1
View File
@@ -9,6 +9,7 @@ void HydraECS::Init()
void HydraECS::Shutdown()
{
m_system_manager->Shutdown();
m_component_manager.release();
m_entity_manager.release();
+2 -1
View File
@@ -23,9 +23,10 @@ public:
}
void DestroyEntity(HydraID entity_id)
{
m_system_manager->EntityDeleted(entity_id);
m_entity_manager->DeleteEntity(entity_id);
m_component_manager->EntityDeleted(entity_id);
m_system_manager->EntityDeleted(entity_id);
}
template <typename T>
+18 -1
View File
@@ -6,7 +6,14 @@ void HydraSystem::Update(float delta_t_seconds)
UpdateSystem(delta_t_seconds);
}
void HydraSystem::Shutdown()
{
for(HydraID entity_id : Entities)
{
DestroyComponents(entity_id);
}
FreeSystemResources();
}
void HydraSystem::InitialiseComponents()
{
for(auto it = EntitiesToCreate.begin(); it != EntitiesToCreate.end(); ++it)
@@ -16,3 +23,13 @@ void HydraSystem::InitialiseComponents()
}
EntitiesToCreate.clear();
}
void HydraSystem::DestroyComponents(HydraID actor_id)
{
auto it = std::find(Entities.begin(), Entities.end(), actor_id);
if(it == Entities.end())
{
return;
}
DestroyComponent(actor_id);
}
+4 -2
View File
@@ -13,13 +13,15 @@ class HydraSystem : public HydraObject
void Update(float delta_t_seconds);
void InitialiseComponents();
virtual void Shutdown() {};
void DestroyComponents(HydraID actor_id);
virtual void Shutdown();
virtual void Initialise(){};
protected:
virtual void UpdateSystem(float delta_t_seconds) = 0;
virtual void InitialiseComponent(HydraID actor_id) {};
virtual void DestroyComponent(HydraID actor_id) {};
virtual void FreeSystemResources(){};
};
#endif /* HYDRASYSTEM */
@@ -72,6 +72,7 @@ public:
// Entity signature does not match system signature - erase from set
else
{
system->DestroyComponents(entity_id);
system->Entities.erase(entity_id);
system->EntitiesToCreate.erase(entity_id);
}
@@ -82,6 +83,7 @@ public:
for (auto const& pair : m_systems)
{
auto const& system = pair.second;
system->DestroyComponents(entity_id);
system->Entities.erase(entity_id);
system->EntitiesToCreate.erase(entity_id);
}
@@ -15,6 +15,7 @@
#include "../../task/buffer/HydraUpdateWholeGPUBufferTask.hpp"
#include "../../task/buffer/HydraUpdatePartialGPUBufferTask.hpp"
#include "../../task/buffer/HydraCreateUnBoundTextureTask.hpp"
#include "../../task/buffer/HydraDeleteTextureTask.hpp"
#include "../../task/renderer/HydraCreateCascadeShadowFrameBuffer.hpp"
#include "../../task/renderer/HydraCreateShadowFrameBuffer.hpp"
#include "../../actor/HydraActorManager.h"
@@ -42,10 +43,15 @@ void HydraDirectionalShadowSourceSystem::InitialiseComponent(HydraID entity_id)
light_comp.shadow_caster = 1;
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::DestroyComponent(HydraID entity_id)
{
HydraEngine *engine = GetEngine();
HydraECS *ecs = engine->ECS();
HydraDirectionalShadowSourceComponent& shadow_comp = ecs->GetComponent<HydraDirectionalShadowSourceComponent>(entity_id);
GetEngine()->ShadowBufferManager()->DeleteDirectionalShadow(shadow_comp.shadow_id);
}
void HydraDirectionalShadowSourceSystem::UpdateSystem(float delta_t_seconds)
@@ -119,7 +125,7 @@ void HydraDirectionalShadowSourceSystem::_InitialiseShadowMap(HydraID entity_id)
uint32_t depth_texture_id = 0;
HydraID create_framebuffer_task_id = task_scheduler->CreateTask<HydraCreateCascadeShadowFrameBuffer>(HydraThreadAffinity::Render);
HydraCreateCascadeShadowFrameBuffer *fb_task = static_cast<HydraCreateCascadeShadowFrameBuffer *>(task_scheduler->GetTask(create_framebuffer_task_id));
fb_task->Initialise(&shad_comp.shadow_texture_id, &depth_texture_id, &shad_comp.frame_buffer_id);
fb_task->Initialise(&depth_texture_id, &shad_comp.frame_buffer_id);
task_scheduler->WaitForTask(create_framebuffer_task_id);
shad_comp.shadow_texture_id = depth_texture_id;
@@ -14,9 +14,11 @@ class HydraDirectionalShadowSourceSystem : public HydraSystem
virtual void Initialise() override;
protected:
void InitialiseComponent(HydraID entity_id) override;
void DestroyComponent(HydraID entity_id) override;
void UpdateSystem(float delta_t_seconds) override;
private:
void _UpdateShadowMap(HydraID entity_id);
void _InitialiseShadowMap(HydraID entity_id);
HydraID m_shadow_actor_id = INVALID_HYDRA_ID;
std::mutex m_mutex;
@@ -8,6 +8,7 @@
#include "../../scheduler/HydraTaskScheduler.h"
#include "../../task/buffer/HydraCreateGPUBufferTask.hpp"
#include "../../task/buffer/HydraDeleteGPUBufferTask.hpp"
#include "../../task/buffer/HydraUpdatePartialGPUBufferTask.hpp"
#include "../../actor/HydraActorManager.h"
#include <GLMIncludes.h>
@@ -38,6 +39,15 @@ void HydraLightSystem::InitialiseComponent(HydraID entity_id)
m_lights.push_back(light_comp);
}
void HydraLightSystem::FreeSystemResources()
{
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_light_buffer_id);
task_scheduler->WaitForTask(delete_gpu_buffer_task_id);
}
void HydraLightSystem::UpdateSystem(float delta_t_seconds)
{
_WriteToGPU();
@@ -17,6 +17,7 @@ class HydraLightSystem : public HydraSystem
uint32_t GetLightCount();
protected:
void InitialiseComponent(HydraID entity_id) override;
void FreeSystemResources() override;
virtual void UpdateSystem(float delta_t_seconds);
private:
void _WriteToGPU();
@@ -8,6 +8,7 @@
#include "../../scheduler/HydraTaskScheduler.h"
#include "../../task/buffer/HydraCreateGPUBufferTask.hpp"
#include "../../task/buffer/HydraDeleteGPUBufferTask.hpp"
#include "../../task/buffer/HydraUpdateWholeGPUBufferTask.hpp"
#include "../../actor/HydraActorManager.h"
@@ -32,6 +33,21 @@ void HydraMaterialSystem::InitialiseComponent(HydraID entity_id)
{
}
void HydraMaterialSystem::FreeSystemResources()
{
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);
}
void HydraMaterialSystem::UpdateSystem(float delta_t_seconds)
{
_WriteToGPU();
@@ -15,7 +15,10 @@ class HydraMaterialSystem : public HydraSystem
void Initialise() override;
protected:
void InitialiseComponent(HydraID entity_id) override;
void FreeSystemResources() override;
virtual void UpdateSystem(float delta_t_seconds);
private:
void _WriteToGPU();
HydraID m_material_buffer_id = INVALID_HYDRA_ID;
@@ -5,7 +5,7 @@
#include "../../buffer/HydraBufferManager.h"
#include "../../scheduler/HydraTaskScheduler.h"
#include "../../task/buffer/HydraCreateVertexBufferTask.hpp"
#include "../../task/buffer/HydraDeleteVertexBufferTask.hpp"
#include "../../task/buffer/HydraUpdateVertexBufferTask.hpp"
#include "../../mesh/HydraMeshManager.h"
void HydraMeshSystem::Initialise()
@@ -13,6 +13,8 @@ void HydraMeshSystem::Initialise()
}
void HydraMeshSystem::InitialiseComponent(HydraID entity_id)
{
HydraECS* ecs = GetEngine()->ECS();
@@ -42,3 +44,19 @@ void HydraMeshSystem::InitialiseComponent(HydraID entity_id)
task_scheduler->WaitForTask(update_buffer_task_id);
mesh_comp.mesh_state = HYDRA_STATE::Ready;
}
void HydraMeshSystem::DestroyComponent(HydraID entity_id)
{
HydraECS* ecs = GetEngine()->ECS();
HydraTaskScheduler *task_scheduler = GetEngine()->TaskScheduler();
HydraBufferManager *buffer_manager = GetEngine()->BufferManager();
HydraMeshComponent mesh_comp = ecs->GetComponent<HydraMeshComponent>(entity_id);
HydraID delete_vertex_task_id = task_scheduler->CreateTask<HydraDeleteVertexBufferTask>(HydraThreadAffinity::Render);
HydraDeleteVertexBufferTask *vertex_task = static_cast<HydraDeleteVertexBufferTask *>(task_scheduler->GetTask(delete_vertex_task_id));
vertex_task->Intialise(mesh_comp.vertex_buffer_id);
task_scheduler->WaitForTask(delete_vertex_task_id);
GetEngine()->MeshManager()->DeleteMesh(mesh_comp.mesh_id);
}
@@ -11,8 +11,11 @@ class HydraMeshSystem : public HydraSystem
public:
void Initialise() override;
protected:
void InitialiseComponent(HydraID entity_id) override;
void DestroyComponent(HydraID entity_id) override;
virtual void UpdateSystem(float delta_t_seconds){}
};
@@ -49,6 +49,14 @@ void HydraPointShadowSourceSystem::UpdateSystem(float delta_t_seconds)
}
}
void HydraPointShadowSourceSystem::DestroyComponent(HydraID entity_id)
{
HydraEngine *engine = GetEngine();
HydraECS *ecs = engine->ECS();
HydraPointShadowSourceComponent& shadow_comp = ecs->GetComponent<HydraPointShadowSourceComponent>(entity_id);
GetEngine()->ShadowBufferManager()->DeletePointShadow(shadow_comp.shadow_id);
}
void HydraPointShadowSourceSystem::_UpdateShadowMap(HydraID entity_id)
{
HydraEngine *engine = GetEngine();
@@ -16,6 +16,7 @@ class HydraPointShadowSourceSystem : public HydraSystem
protected:
void InitialiseComponent(HydraID entity_id) override;
void UpdateSystem(float delta_t_seconds) override;
void DestroyComponent(HydraID entity_id) override;
private:
void _UpdateShadowMap(HydraID entity_id);
void _InitialiseShadowMap(HydraID entity_id);
@@ -56,6 +56,14 @@ void HydraSpotShadowSourceSystem::UpdateSystem(float delta_t_seconds)
}
void HydraSpotShadowSourceSystem::DestroyComponent(HydraID entity_id)
{
HydraEngine *engine = GetEngine();
HydraECS *ecs = engine->ECS();
HydraSpotShadowSourceComponent& shadow_comp = ecs->GetComponent<HydraSpotShadowSourceComponent>(entity_id);
GetEngine()->ShadowBufferManager()->DeleteSpotShadow(shadow_comp.shadow_id);
}
void HydraSpotShadowSourceSystem::_UpdateShadowMap(HydraID entity_id)
{
HydraEngine *engine = GetEngine();
@@ -17,6 +17,7 @@ class HydraSpotShadowSourceSystem : public HydraSystem
protected:
void InitialiseComponent(HydraID entity_id) override;
void UpdateSystem(float delta_t_seconds) override;
void DestroyComponent(HydraID entity_id) override;
private:
void _UpdateShadowMap(HydraID entity_id);
void _InitialiseShadowMap(HydraID entity_id);
@@ -4,6 +4,7 @@
#include "../components/HydraPositionComponent.h"
#include "../../scheduler/HydraTaskScheduler.h"
#include "../../task/buffer/HydraCreateGPUBufferTask.hpp"
#include "../../task/buffer/HydraDeleteGPUBufferTask.hpp"
#include "../../task/buffer/HydraUpdateWholeGPUBufferTask.hpp"
#include "../../actor/HydraActorManager.h"
@@ -27,6 +28,16 @@ void HydraTransformSystem::Initialise()
m_model_matrix.resize(MAX_ACTORS);
}
void HydraTransformSystem::FreeSystemResources()
{
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_transform_buffer_id);
task_scheduler->WaitForTask(delete_gpu_buffer_task_id);
}
void HydraTransformSystem::UpdateSystem(float delta_t_seconds)
{
HydraECS *ecs = GetEngine()->ECS();
@@ -15,6 +15,7 @@ class HydraTransformSystem : public HydraSystem
virtual void UpdateSystem(float delta_t_seconds) override;
void InitialiseComponent(HydraID actor_id) override;
void FreeSystemResources() override;
private:
void _UpdateChild(HydraID parent_id, HydraID actor_id, glm::mat4 parent_transform);
void _WriteToGPU();