2026-07-17 15:30:29 +01:00
|
|
|
#include "HydraEngine.h"
|
|
|
|
|
#include "HydraInputManager.h"
|
|
|
|
|
|
|
|
|
|
#include "../scheduler/HydraTaskScheduler.h"
|
|
|
|
|
|
|
|
|
|
#include "../scheduler/HydraTaskScheduler.h"
|
|
|
|
|
#include "../windowmanager/HydraWindowManager.h"
|
|
|
|
|
|
|
|
|
|
#include "../game/HydraGameProxy.h"
|
|
|
|
|
#include "../renderer/HydraRenderer.h"
|
|
|
|
|
#include "../buffer/HydraBufferManager.h"
|
|
|
|
|
#include "../buffer/HydraVertexBufferManager.h"
|
|
|
|
|
#include "../buffer/HydraTextureBufferManager.h"
|
|
|
|
|
#include "../buffer/HydraMaterialBufferManager.h"
|
|
|
|
|
#include "../buffer/HydraLightBufferManager.h"
|
2026-08-06 21:11:33 +01:00
|
|
|
#include "../buffer/HydraShadowBufferManager.h"
|
2026-07-17 15:30:29 +01:00
|
|
|
|
|
|
|
|
#include "../ecs/HydraECS.h"
|
|
|
|
|
#include "../ecs/systems/HydraTransformSystem.h"
|
|
|
|
|
#include "../ecs/systems/HydraMeshSystem.h"
|
|
|
|
|
#include "../ecs/systems/HydraRenderSystem.h"
|
|
|
|
|
#include "../ecs/systems/HydraMaterialSystem.h"
|
|
|
|
|
#include "../ecs/systems/HydraLightSystem.h"
|
2026-08-04 18:32:37 +01:00
|
|
|
#include "../ecs/systems/HydraDirectionalShadowSourceSystem.h"
|
2026-08-04 22:40:48 +01:00
|
|
|
#include "../ecs/systems/HydraSpotShadowSourceSystem.h"
|
|
|
|
|
|
2026-07-17 15:30:29 +01:00
|
|
|
#include "../ecs/components/HydraPositionComponent.h"
|
|
|
|
|
#include "../ecs/components/HydraMeshComponent.h"
|
|
|
|
|
#include "../ecs/components/HydraRenderableComponent.h"
|
|
|
|
|
#include "../ecs/components/HydraTextureComponent.h"
|
|
|
|
|
#include "../ecs/components/HydraMaterialComponent.h"
|
|
|
|
|
#include "../ecs/components/HydraLightComponent.h"
|
2026-08-04 18:32:37 +01:00
|
|
|
#include "../ecs/components/HydraDirectionalShadowSourceComponent.h"
|
2026-08-04 22:40:48 +01:00
|
|
|
#include "../ecs/components/HydraSpotShadowSourceComponent.h"
|
2026-07-17 15:30:29 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
#include "../camera/HydraCamera.h"
|
|
|
|
|
#include "../actor/HydraActorManager.h"
|
|
|
|
|
|
|
|
|
|
#include "../pipeline/HydraPipeline.h"
|
|
|
|
|
#include "../pipeline/HydraForwardPipeline.h"
|
|
|
|
|
#include "../pipeline/HydraDeferredPipeline.h"
|
2026-07-28 00:26:04 +01:00
|
|
|
#include "../pipeline/HydraShadowPipeline.h"
|
2026-07-17 15:30:29 +01:00
|
|
|
|
|
|
|
|
#include "../task/windowmanager/HydraInitialiseWindowManagerTask.hpp"
|
|
|
|
|
#include "../task/windowmanager/HydraShutdownWindowManagerTask.hpp"
|
|
|
|
|
#include "../task/windowmanager/HydraProcessInputTask.hpp"
|
|
|
|
|
#include "../task/renderer/HydraInitialiseRendererTask.hpp"
|
|
|
|
|
#include "../task/renderer/HydraRenderTask.hpp"
|
|
|
|
|
#include "../task/pipeline/HydraInitialisePipelineTask.hpp"
|
|
|
|
|
#include "../task/pipeline/HydraShutdownPipelineTask.hpp"
|
|
|
|
|
#include "../task/pipeline/HydraRenderPipelineTask.hpp"
|
|
|
|
|
|
|
|
|
|
#include "../task/ecs/HydraUpdateSystemTask.hpp"
|
|
|
|
|
#include "../task/ecs/HydraInitialiseComponentsTask.hpp"
|
|
|
|
|
#include "../task/buffer/HydraShutdownBufferManagerTask.hpp"
|
|
|
|
|
#include "../task/buffer/HydraInitialiseTextureManagerTask.hpp"
|
2026-08-06 21:11:33 +01:00
|
|
|
#include "../task/buffer/HydraInitialiseShadowBufferTask.hpp"
|
2026-07-17 15:30:29 +01:00
|
|
|
#include "../task/actor/HydraUpdatePlayerTask.h"
|
2026-07-28 19:02:45 +01:00
|
|
|
|
2026-07-28 00:26:04 +01:00
|
|
|
#include "../task/renderer/HydraEndRenderTask.hpp"
|
2026-07-17 15:30:29 +01:00
|
|
|
|
|
|
|
|
#include "../mesh/HydraMeshManager.h"
|
|
|
|
|
HydraTaskScheduler *const HydraEngine::TaskScheduler()
|
|
|
|
|
{
|
|
|
|
|
return m_task_scheduler;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void HydraEngine::InitialiseGame(HydraGameProxy *game)
|
|
|
|
|
{
|
|
|
|
|
m_game = game;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void HydraEngine::Start()
|
|
|
|
|
{
|
|
|
|
|
_CreateManagers();
|
|
|
|
|
_InitialiseManagers();
|
|
|
|
|
_InitialiseSystems();
|
|
|
|
|
m_game->Initialise();
|
|
|
|
|
_GameLoop();
|
|
|
|
|
_Shutdown();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
HydraWindowManager *const HydraEngine::WindowManager()
|
|
|
|
|
{
|
|
|
|
|
return m_window_manager;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
HydraRenderSettings HydraEngine::RenderSettings()
|
|
|
|
|
{
|
|
|
|
|
return m_render_settings;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
HydraInputManager *const HydraEngine::InputManager()
|
|
|
|
|
{
|
|
|
|
|
return m_input_manager;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
HydraRenderer *const HydraEngine::Renderer()
|
|
|
|
|
{
|
|
|
|
|
return m_renderer;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
HydraECS *const HydraEngine::ECS()
|
|
|
|
|
{
|
|
|
|
|
return m_ecs;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
HydraActorManager *const HydraEngine::ActorManager()
|
|
|
|
|
{
|
|
|
|
|
return m_actor_manager;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
HydraCamera *const HydraEngine::Camera()
|
|
|
|
|
{
|
|
|
|
|
return m_camera;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
HydraBufferManager *const HydraEngine::BufferManager()
|
|
|
|
|
{
|
|
|
|
|
return m_buffer_manager;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
HydraVertexBufferManager *const HydraEngine::VertexBufferManager()
|
|
|
|
|
{
|
|
|
|
|
return m_vertex_buffer_manager;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
HydraMeshManager *const HydraEngine::MeshManager()
|
|
|
|
|
{
|
|
|
|
|
return m_mesh_manager;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
HydraPipeline *const HydraEngine::Pipeline()
|
|
|
|
|
{
|
|
|
|
|
return m_pipeline;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
HydraTextureBufferManager *const HydraEngine::TextureBufferManager()
|
|
|
|
|
{
|
|
|
|
|
return m_texture_buffer_manager;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
HydraMaterialBufferManager *const HydraEngine::MaterialBufferManager()
|
|
|
|
|
{
|
|
|
|
|
return m_material_buffer_manager;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
HydraLightBufferManager *const HydraEngine::LightBufferManager()
|
|
|
|
|
{
|
|
|
|
|
return m_light_buffer_manager;
|
|
|
|
|
}
|
|
|
|
|
|
2026-08-06 21:11:33 +01:00
|
|
|
HydraShadowBufferManager *const HydraEngine::ShadowBufferManager()
|
|
|
|
|
{
|
|
|
|
|
return m_shadow_buffer_manager;
|
|
|
|
|
}
|
|
|
|
|
|
2026-07-17 15:30:29 +01:00
|
|
|
void HydraEngine::PossessPlayer(HydraID actor_id)
|
|
|
|
|
{
|
|
|
|
|
m_possessed_actor_id = actor_id;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
HydraID HydraEngine::GetPossessedPlayer()
|
|
|
|
|
{
|
|
|
|
|
return m_possessed_actor_id;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
float HydraEngine::GetDeltaT()
|
|
|
|
|
{
|
|
|
|
|
return m_delta_t;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
uint32_t HydraEngine::GetLightCount()
|
|
|
|
|
{
|
|
|
|
|
return m_light_system->GetLightCount();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void HydraEngine::_CreateManagers()
|
|
|
|
|
{
|
|
|
|
|
m_camera = new HydraCamera();
|
|
|
|
|
m_task_scheduler = new HydraTaskScheduler();
|
|
|
|
|
m_window_manager = new HydraWindowManager();
|
|
|
|
|
m_input_manager = new HydraInputManager();
|
|
|
|
|
m_renderer = new HydraRenderer();
|
|
|
|
|
m_ecs = new HydraECS();
|
|
|
|
|
m_actor_manager = new HydraActorManager();
|
|
|
|
|
m_buffer_manager = new HydraBufferManager();
|
|
|
|
|
m_vertex_buffer_manager = new HydraVertexBufferManager();
|
|
|
|
|
m_mesh_manager = new HydraMeshManager();
|
|
|
|
|
m_pipeline = new HydraForwardPipeline();
|
|
|
|
|
m_deferred_pipeline = new HydraDeferredPipeline();
|
2026-07-28 00:26:04 +01:00
|
|
|
m_shadow_pipeline = new HydraShadowPipeline();
|
2026-07-17 15:30:29 +01:00
|
|
|
m_texture_buffer_manager = new HydraTextureBufferManager();
|
|
|
|
|
m_material_buffer_manager = new HydraMaterialBufferManager();
|
|
|
|
|
m_light_buffer_manager = new HydraLightBufferManager();
|
2026-08-06 21:11:33 +01:00
|
|
|
m_shadow_buffer_manager = new HydraShadowBufferManager();
|
2026-07-17 15:30:29 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void HydraEngine::_InitialiseManagers()
|
|
|
|
|
{
|
|
|
|
|
m_task_scheduler->Initialise(1);
|
|
|
|
|
HydraID create_window_task_id = m_task_scheduler->CreateTask<HydraInitialiseWindowManagerTask>(HydraThreadAffinity::Render);
|
|
|
|
|
m_task_scheduler->WaitForTask(create_window_task_id);
|
|
|
|
|
|
|
|
|
|
HydraID create_renderer_task_id = m_task_scheduler->CreateTask<HydraInitialiseRendererTask>(HydraThreadAffinity::Render);
|
|
|
|
|
m_task_scheduler->WaitForTask(create_renderer_task_id);
|
|
|
|
|
|
|
|
|
|
m_mesh_manager->Initialise();
|
|
|
|
|
m_ecs->Init();
|
|
|
|
|
m_actor_manager->Initialise(MAX_ACTORS);
|
|
|
|
|
|
|
|
|
|
m_buffer_manager->Initialise();
|
|
|
|
|
m_vertex_buffer_manager->Initialise();
|
|
|
|
|
m_texture_buffer_manager->Intialise();
|
|
|
|
|
m_material_buffer_manager->Intialise();
|
|
|
|
|
m_light_buffer_manager->Initialise();
|
|
|
|
|
|
2026-08-06 21:11:33 +01:00
|
|
|
HydraID create_shadow_buffer_task_id = m_task_scheduler->CreateTask<HydraInitialiseShadowBufferTask>(HydraThreadAffinity::Render);
|
|
|
|
|
m_task_scheduler->WaitForTask(create_shadow_buffer_task_id);
|
|
|
|
|
|
2026-07-17 15:30:29 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void HydraEngine::_InitialiseSystems()
|
|
|
|
|
{
|
|
|
|
|
m_ecs->RegisterComponentType<HydraPositionComponent>();
|
|
|
|
|
m_ecs->RegisterComponentType<HydraMeshComponent>();
|
|
|
|
|
m_ecs->RegisterComponentType<HydraRenderableComponent>();
|
|
|
|
|
m_ecs->RegisterComponentType<HydraTextureComponent>();
|
|
|
|
|
m_ecs->RegisterComponentType<HydraMaterialComponent>();
|
|
|
|
|
m_ecs->RegisterComponentType<HydraLightComponent>();
|
2026-08-04 18:32:37 +01:00
|
|
|
m_ecs->RegisterComponentType<HydraDirectionalShadowSourceComponent>();
|
2026-08-04 22:40:48 +01:00
|
|
|
m_ecs->RegisterComponentType<HydraSpotShadowSourceComponent>();
|
2026-07-17 15:30:29 +01:00
|
|
|
|
|
|
|
|
m_mesh_system = m_ecs->RegisterSystem<HydraMeshSystem>();
|
|
|
|
|
m_transform_system = m_ecs->RegisterSystem<HydraTransformSystem>();
|
|
|
|
|
m_render_system = m_ecs->RegisterSystem<HydraRenderSystem>();
|
|
|
|
|
m_material_system = m_ecs->RegisterSystem<HydraMaterialSystem>();
|
|
|
|
|
m_light_system = m_ecs->RegisterSystem<HydraLightSystem>();
|
2026-08-04 22:40:48 +01:00
|
|
|
m_directional_shadow_system = m_ecs->RegisterSystem<HydraDirectionalShadowSourceSystem>();
|
|
|
|
|
m_spot_shadow_system = m_ecs->RegisterSystem<HydraSpotShadowSourceSystem>();
|
2026-07-17 15:30:29 +01:00
|
|
|
|
|
|
|
|
HydraSignature mesh_sig;
|
|
|
|
|
HydraSignature trans_sig;
|
|
|
|
|
HydraSignature render_sig;
|
|
|
|
|
HydraSignature material_sig;
|
|
|
|
|
HydraSignature light_sig;
|
2026-08-04 22:40:48 +01:00
|
|
|
HydraSignature directional_shadow_sig;
|
|
|
|
|
HydraSignature spot_shadow_sig;
|
2026-07-17 15:30:29 +01:00
|
|
|
|
|
|
|
|
mesh_sig.set(m_ecs->GetComponentType<HydraMeshComponent>(),true);
|
|
|
|
|
trans_sig.set(m_ecs->GetComponentType<HydraPositionComponent>(),true);
|
|
|
|
|
render_sig.set(m_ecs->GetComponentType<HydraRenderableComponent>(),true);
|
|
|
|
|
material_sig.set(m_ecs->GetComponentType<HydraMaterialComponent>(),true);
|
2026-07-25 16:40:34 +01:00
|
|
|
|
2026-07-17 15:30:29 +01:00
|
|
|
light_sig.set(m_ecs->GetComponentType<HydraLightComponent>(), true);
|
2026-07-25 16:40:34 +01:00
|
|
|
light_sig.set(m_ecs->GetComponentType<HydraPositionComponent>(), true);
|
|
|
|
|
|
2026-08-04 22:40:48 +01:00
|
|
|
directional_shadow_sig.set(m_ecs->GetComponentType<HydraLightComponent>(), true);
|
|
|
|
|
directional_shadow_sig.set(m_ecs->GetComponentType<HydraPositionComponent>(), true);
|
|
|
|
|
directional_shadow_sig.set(m_ecs->GetComponentType<HydraDirectionalShadowSourceComponent>(), true);
|
|
|
|
|
|
|
|
|
|
spot_shadow_sig.set(m_ecs->GetComponentType<HydraLightComponent>(), true);
|
|
|
|
|
spot_shadow_sig.set(m_ecs->GetComponentType<HydraPositionComponent>(), true);
|
|
|
|
|
spot_shadow_sig.set(m_ecs->GetComponentType<HydraSpotShadowSourceComponent>(), true);
|
2026-07-17 15:30:29 +01:00
|
|
|
|
|
|
|
|
m_ecs->SetSystemSignature<HydraMeshSystem>(mesh_sig);
|
|
|
|
|
m_ecs->SetSystemSignature<HydraTransformSystem>(trans_sig);
|
|
|
|
|
m_ecs->SetSystemSignature<HydraRenderSystem>(render_sig);
|
|
|
|
|
m_ecs->SetSystemSignature<HydraMaterialSystem>(material_sig);
|
|
|
|
|
m_ecs->SetSystemSignature<HydraLightSystem>(light_sig);
|
2026-08-04 22:40:48 +01:00
|
|
|
m_ecs->SetSystemSignature<HydraDirectionalShadowSourceSystem>(directional_shadow_sig);
|
|
|
|
|
m_ecs->SetSystemSignature<HydraSpotShadowSourceSystem>(spot_shadow_sig);
|
2026-07-28 00:26:04 +01:00
|
|
|
|
2026-07-17 15:30:29 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void HydraEngine::_UpdateSystems()
|
|
|
|
|
{
|
|
|
|
|
HydraID posUpdateBarrierID = m_task_scheduler->CreateBarrier();
|
|
|
|
|
|
|
|
|
|
HydraID update_trans_id = m_task_scheduler->CreateTask<HydraUpdateSystemTask>(HydraThreadAffinity::General, posUpdateBarrierID);
|
|
|
|
|
HydraUpdateSystemTask* update_trans_task = static_cast<HydraUpdateSystemTask*>(m_task_scheduler->GetTask(update_trans_id));
|
|
|
|
|
update_trans_task->Initialise(m_delta_t, m_transform_system);
|
|
|
|
|
|
|
|
|
|
HydraID update_mat_id = m_task_scheduler->CreateTask<HydraUpdateSystemTask>(HydraThreadAffinity::General, posUpdateBarrierID);
|
|
|
|
|
HydraUpdateSystemTask* update_mat_task = static_cast<HydraUpdateSystemTask*>(m_task_scheduler->GetTask(update_mat_id));
|
|
|
|
|
update_mat_task->Initialise(m_delta_t, m_material_system);
|
|
|
|
|
|
|
|
|
|
m_task_scheduler->StartTask(update_trans_id);
|
|
|
|
|
m_task_scheduler->StartTask(update_mat_id);
|
|
|
|
|
m_task_scheduler->WaitForBarrier(posUpdateBarrierID);
|
|
|
|
|
|
|
|
|
|
HydraID update_light_id = m_task_scheduler->CreateTask<HydraUpdateSystemTask>(HydraThreadAffinity::General);
|
|
|
|
|
HydraUpdateSystemTask* update_light_task = static_cast<HydraUpdateSystemTask*>(m_task_scheduler->GetTask(update_light_id));
|
|
|
|
|
update_light_task->Initialise(m_delta_t, m_light_system);
|
|
|
|
|
m_task_scheduler->WaitForTask(update_light_id);
|
2026-07-28 00:26:04 +01:00
|
|
|
|
2026-08-06 21:11:33 +01:00
|
|
|
HydraID shadow_barrier = m_task_scheduler->CreateBarrier();
|
|
|
|
|
|
|
|
|
|
HydraID update_shadow_id = m_task_scheduler->CreateTask<HydraUpdateSystemTask>(HydraThreadAffinity::General, shadow_barrier);
|
2026-07-28 00:26:04 +01:00
|
|
|
HydraUpdateSystemTask* update_shadow_task = static_cast<HydraUpdateSystemTask*>(m_task_scheduler->GetTask(update_shadow_id));
|
2026-08-04 22:40:48 +01:00
|
|
|
update_shadow_task->Initialise(m_delta_t, m_directional_shadow_system);
|
2026-08-06 21:11:33 +01:00
|
|
|
|
2026-07-28 00:26:04 +01:00
|
|
|
|
2026-08-06 21:11:33 +01:00
|
|
|
HydraID update_spot_shadow_id = m_task_scheduler->CreateTask<HydraUpdateSystemTask>(HydraThreadAffinity::General, shadow_barrier);
|
2026-08-04 22:40:48 +01:00
|
|
|
HydraUpdateSystemTask* update_spot_shadow_task = static_cast<HydraUpdateSystemTask*>(m_task_scheduler->GetTask(update_spot_shadow_id));
|
|
|
|
|
update_spot_shadow_task->Initialise(m_delta_t, m_spot_shadow_system);
|
2026-08-06 21:11:33 +01:00
|
|
|
|
|
|
|
|
m_task_scheduler->StartTask(update_shadow_id);
|
|
|
|
|
m_task_scheduler->StartTask(update_spot_shadow_id);
|
|
|
|
|
m_task_scheduler->WaitForBarrier(shadow_barrier);
|
2026-08-04 22:40:48 +01:00
|
|
|
|
2026-08-06 21:11:33 +01:00
|
|
|
m_shadow_buffer_manager->UpdateShadowBuffer();
|
2026-07-17 15:30:29 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void HydraEngine::_GameLoop()
|
|
|
|
|
{
|
|
|
|
|
// game loop
|
|
|
|
|
std::chrono::steady_clock clock;
|
|
|
|
|
int fpsFrameCount = 0;
|
|
|
|
|
int fpsHighLowCount = 0;
|
|
|
|
|
|
|
|
|
|
float fpsLow = 99999;
|
|
|
|
|
float fpsHigh = 0;
|
|
|
|
|
float totalTime = 0.0f;
|
|
|
|
|
bool fixed_tick = false;
|
|
|
|
|
|
|
|
|
|
std::chrono::time_point<std::chrono::steady_clock> last_tick = clock.now();
|
|
|
|
|
std::chrono::time_point<std::chrono::steady_clock> last_fixed_tick = clock.now();
|
|
|
|
|
|
|
|
|
|
// m_fps_label_id = UIManager()->CreateWidget<HydraUILabelWidget>();
|
|
|
|
|
// HydraUILabelWidget* label = (HydraUILabelWidget*)UIManager()->GetWidget(m_fps_label_id);
|
|
|
|
|
// label->SetText("FPS");
|
|
|
|
|
// label->Position = glm::vec3(0, 200, 0);
|
|
|
|
|
// label->SetFont("Calibri", 10.0f);
|
|
|
|
|
|
|
|
|
|
HydraID initialise_pipeline_task_id = m_task_scheduler->CreateTask<HydraInitialisePipelineTask>(HydraThreadAffinity::Render);
|
|
|
|
|
HydraInitialisePipelineTask *pipeline_task = static_cast<HydraInitialisePipelineTask*>(m_task_scheduler->GetTask(initialise_pipeline_task_id));
|
|
|
|
|
pipeline_task->Initialise(m_pipeline);
|
|
|
|
|
m_task_scheduler->WaitForTask(initialise_pipeline_task_id);
|
|
|
|
|
|
2026-07-28 00:26:04 +01:00
|
|
|
HydraID initialise_shadow_pipeline_task_id = m_task_scheduler->CreateTask<HydraInitialisePipelineTask>(HydraThreadAffinity::Render);
|
|
|
|
|
HydraInitialisePipelineTask *pipeline_shadow_task = static_cast<HydraInitialisePipelineTask*>(m_task_scheduler->GetTask(initialise_shadow_pipeline_task_id));
|
|
|
|
|
pipeline_shadow_task->Initialise(m_shadow_pipeline);
|
|
|
|
|
m_task_scheduler->WaitForTask(initialise_shadow_pipeline_task_id);
|
|
|
|
|
|
2026-07-17 15:30:29 +01:00
|
|
|
HydraID initialise_def_pipeline_task_id = m_task_scheduler->CreateTask<HydraInitialisePipelineTask>(HydraThreadAffinity::Render);
|
|
|
|
|
HydraInitialisePipelineTask *pipeline_def_task = static_cast<HydraInitialisePipelineTask*>(m_task_scheduler->GetTask(initialise_def_pipeline_task_id));
|
|
|
|
|
pipeline_def_task->Initialise(m_deferred_pipeline);
|
|
|
|
|
m_task_scheduler->WaitForTask(initialise_def_pipeline_task_id);
|
|
|
|
|
|
|
|
|
|
while (m_running)
|
|
|
|
|
{
|
|
|
|
|
HydraID barrierID = m_task_scheduler->CreateBarrier();
|
|
|
|
|
std::chrono::time_point<std::chrono::steady_clock> this_tick = clock.now();
|
|
|
|
|
std::chrono::duration<float> diff = this_tick - last_tick;
|
|
|
|
|
std::chrono::duration<float> fixed_diff = this_tick - last_fixed_tick;
|
|
|
|
|
|
|
|
|
|
totalTime = totalTime += diff.count();
|
|
|
|
|
|
|
|
|
|
m_delta_t = diff.count();
|
|
|
|
|
float fixed_delta_t = fixed_diff.count();
|
|
|
|
|
if (fixed_delta_t > 0.016666666666f)
|
|
|
|
|
{
|
|
|
|
|
m_fixed_delta_t = fixed_diff.count();
|
|
|
|
|
last_fixed_tick = this_tick;
|
|
|
|
|
fixed_tick = true;
|
|
|
|
|
HydraID processInputID = m_task_scheduler->CreateTask<HydraProcessInputTask>(HydraThreadAffinity::Render, barrierID);
|
|
|
|
|
m_task_scheduler->StartTask(processInputID);
|
|
|
|
|
|
|
|
|
|
//Physics here
|
|
|
|
|
}
|
|
|
|
|
if (fpsFrameCount >= 15)
|
|
|
|
|
{
|
|
|
|
|
float fps = 1.0f / (totalTime / fpsFrameCount);
|
|
|
|
|
// m_fps_label->SetText("FPS: " + std::to_string(fps));
|
|
|
|
|
// label->SetText("FPS: " + std::to_string(fps));
|
|
|
|
|
fpsFrameCount = 0;
|
|
|
|
|
totalTime = 0.0f;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
last_tick = this_tick;
|
|
|
|
|
|
|
|
|
|
fpsFrameCount++;
|
|
|
|
|
HydraID initialise_components_id = m_task_scheduler->CreateTask<HydraInitialiseComponentsTask>(HydraThreadAffinity::General, barrierID);
|
|
|
|
|
HydraID update_player_task_id = m_task_scheduler->CreateTask<HydraUpdatePlayerTask>(HydraThreadAffinity::General, barrierID);
|
|
|
|
|
|
|
|
|
|
m_task_scheduler->StartTask(initialise_components_id);
|
|
|
|
|
m_task_scheduler->StartTask(update_player_task_id);
|
|
|
|
|
m_task_scheduler->WaitForBarrier(barrierID);
|
|
|
|
|
m_game->Update(m_delta_t);
|
|
|
|
|
|
|
|
|
|
_UpdateSystems();
|
|
|
|
|
|
2026-07-28 19:02:45 +01:00
|
|
|
|
2026-07-28 00:26:04 +01:00
|
|
|
|
|
|
|
|
HydraID render_shadow_task_id = m_task_scheduler->CreateTask<HydraRenderPipelineTask>(HydraThreadAffinity::Render);
|
|
|
|
|
HydraRenderPipelineTask* render_shadow_task = static_cast<HydraRenderPipelineTask*>(m_task_scheduler->GetTask(render_shadow_task_id));
|
|
|
|
|
render_shadow_task->Initialise(m_shadow_pipeline);
|
|
|
|
|
m_task_scheduler->WaitForTask(render_shadow_task_id);
|
|
|
|
|
|
2026-07-17 15:30:29 +01:00
|
|
|
HydraID render_def_task_id = m_task_scheduler->CreateTask<HydraRenderPipelineTask>(HydraThreadAffinity::Render);
|
|
|
|
|
HydraRenderPipelineTask* render_def_task = static_cast<HydraRenderPipelineTask*>(m_task_scheduler->GetTask(render_def_task_id));
|
|
|
|
|
render_def_task->Initialise(m_deferred_pipeline);
|
|
|
|
|
m_task_scheduler->WaitForTask(render_def_task_id);
|
2026-07-28 00:26:04 +01:00
|
|
|
|
|
|
|
|
HydraID end_task_id = m_task_scheduler->CreateTask<HydraEndRenderTask>(HydraThreadAffinity::Render);
|
|
|
|
|
m_task_scheduler->WaitForTask(end_task_id);
|
2026-07-17 15:30:29 +01:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void HydraEngine::_Shutdown()
|
|
|
|
|
{
|
|
|
|
|
m_actor_manager->Shutdown();
|
|
|
|
|
m_ecs->Shutdown();
|
|
|
|
|
|
|
|
|
|
//Shutdown the buffer and vertex buffer managers
|
|
|
|
|
HydraID shutdown_buffer_mgr_id = m_task_scheduler->CreateTask<HydraShutdownBufferManagerTask>(HydraThreadAffinity::Render);
|
|
|
|
|
m_task_scheduler->WaitForTask(shutdown_buffer_mgr_id);
|
|
|
|
|
|
|
|
|
|
HydraID shutdown_pipeline_id = m_task_scheduler->CreateTask<HydraShutdownPipelineTask>(HydraThreadAffinity::Render);
|
|
|
|
|
HydraShutdownPipelineTask *pipeline_task = static_cast<HydraShutdownPipelineTask*>(m_task_scheduler->GetTask(shutdown_pipeline_id));
|
|
|
|
|
pipeline_task->Initialise(m_pipeline);
|
|
|
|
|
m_task_scheduler->WaitForTask(shutdown_pipeline_id);
|
|
|
|
|
|
|
|
|
|
m_task_scheduler->Shutdown();
|
|
|
|
|
|
|
|
|
|
delete m_actor_manager;
|
|
|
|
|
delete m_ecs;
|
|
|
|
|
delete m_input_manager;
|
|
|
|
|
delete m_window_manager;
|
|
|
|
|
delete m_task_scheduler;
|
|
|
|
|
delete m_buffer_manager;
|
|
|
|
|
delete m_vertex_buffer_manager;
|
|
|
|
|
delete m_pipeline;
|
|
|
|
|
delete m_texture_buffer_manager;
|
|
|
|
|
delete m_material_buffer_manager;
|
|
|
|
|
delete m_light_buffer_manager;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool HydraEngine::KeyPressed(HYDRA_KEY_CODES key)
|
|
|
|
|
{
|
|
|
|
|
return m_input_manager->KeyPressed(key);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
glm::vec2 HydraEngine::MouseChange()
|
|
|
|
|
{
|
|
|
|
|
return m_input_manager->MouseChange();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void HydraEngine::Exit()
|
|
|
|
|
{
|
|
|
|
|
m_running = false;
|
|
|
|
|
}
|