Files
HydraV3/HydraEngine/source/ecs/HydraECS.h
T
2026-07-17 15:30:29 +01:00

106 lines
3.0 KiB
C++

#ifndef HYDRAECS
#define HYDRAECS
#include "../engine/HydraObject.h"
#include "HydraComponentManager.h"
#include "HydraEntityManager.h"
#include "HydraSystemManager.h"
#include <memory>
class HydraECS : HydraObject
{
private:
std::unique_ptr<HydraEntityManager> m_entity_manager;
std::unique_ptr<HydraComponentManager> m_component_manager;
std::unique_ptr<HydraSystemManager> m_system_manager;
public:
void Init();
void Shutdown();
HydraID CreateEntity()
{
return m_entity_manager->CreateEntity();
}
void DestroyEntity(HydraID entity_id)
{
m_entity_manager->DeleteEntity(entity_id);
m_component_manager->EntityDeleted(entity_id);
m_system_manager->EntityDeleted(entity_id);
}
template <typename T>
void RegisterComponentType()
{
m_component_manager->RegisterComponentType<T>();
}
template <typename T>
HydraID GetComponentType()
{
return m_component_manager->GetComponentTypeID<T>();
}
template <typename T>
void AddComponent(HydraID entity_id, T component)
{
// Add teh component to the entity
m_component_manager->AddComponent<T>(entity_id, component);
// Get the current entity signature and update it to include
// the new component
auto signature = m_entity_manager->GetSignature(entity_id);
signature.set(m_component_manager->GetComponentTypeID<T>(), true);
m_entity_manager->SetSignature(entity_id, signature);
// Tell the sytem manager that the entities signature has changed
m_system_manager->EntitySignatureChanged(entity_id, signature);
}
template <typename T>
void RemoveComponent(HydraID entity_id)
{
// Remove the component from the entity
m_component_manager->RemoveComponent<T>(entity_id);
// Get the current signature, remove the component from it and update
auto signature = m_entity_manager->GetSignature(entity_id);
signature.set(m_component_manager->GetComponentTypeID<T>(), false);
m_entity_manager->SetSignature(entity_id, signature);
// Tell the system manager that the entitys signature has changed
m_system_manager->EntitySignatureChanged(entity_id, signature);
}
template <typename T>
bool HasComponent(HydraID entity_id)
{
return m_component_manager->HasComponent<T>(entity_id);
}
template <typename T>
T &GetComponent(HydraID entity_id)
{
return m_component_manager->GetComponent<T>(entity_id);
}
template <typename T>
std::shared_ptr<T> RegisterSystem()
{
return m_system_manager->RegisterSystem<T>();
}
template <typename T>
void SetSystemSignature(HydraSignature signature)
{
m_system_manager->SetSignature<T>(signature);
}
template <typename T>
std::shared_ptr<T> GetSystem()
{
return m_system_manager->GetSystem<T>();
}
void InitialiseComponents()
{
m_system_manager->InitialiseComponents();
}
};
#endif /* HYDRAECS */