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

97 lines
2.7 KiB
C++

#ifndef HYDRAACTORMANAGER
#define HYDRAACTORMANAGER
#include "../engine/HydraObject.h"
#include "../task/HydraTask.h"
#include "HydraActor.h"
#include <GLMIncludes.h>
#include <mutex>
#include <vector>
#include <deque>
#include <queue>
// #include <assimp/Importer.hpp> // C++ importer interface
// #include <assimp/scene.h> // Output data structure
// #include <assimp/postprocess.h> // Post processing flags
class CLASS_DEFINE HydraActorManager : public HydraObject
{
private:
std::mutex m_mutex;
std::vector<HydraActor*> m_actors;
std::deque<HydraID> m_available_actor_ids;
std::deque<HydraID> m_actors_waiting_for_init;
std::deque<HydraID> m_actors_waiting_for_delete;
size_t m_max_actors;
HydraID _SaveActor(HydraActor* actor);
void _RemoveActorFromWaiting(HydraID actorID);
void _RemoveActorFromTickFixed(HydraID actorID);
void _SetActorDeleted(HydraID actorID);
public:
void Initialise(size_t max_actors);
template<class T> HydraID CreateActor();
HydraID LoadActor(std::string filename);
void DeleteActor(HydraID actorID);
HydraActor* const GetActor(HydraID actorID);
std::vector<HydraID>& GetChildren(HydraID actor_id);
void TickActors(float delta_t);
void InitialiseActor(HydraID actorID);
void Shutdown();
void RotateActor(HydraID actorID, float euler_x, float euler_y, float euler_z);
void SetPosition(HydraID actorID, glm::dvec3 position);
void SetOrientation(HydraID actorID, float x, float y, float z);
void SetScale(HydraID actor_id, glm::dvec3 scaling);
void TranslateActor(HydraID actorID, glm::dvec3 translation);
void SetRelationship(HydraID parent_id, HydraID child_id);
void AddComponentType(HydraID actorID, uint32_t component_type);
bool HasComponentType(HydraID actorID, uint32_t component_type);
void RemoveComponentType(HydraID actorID, uint32_t component_type);
HydraID GetParent(HydraID actor_id);
HydraID GetRoot(HydraID actor_id);
glm::mat4 GetActorPose(HydraID actorID);
glm::dvec3 GetActorPosition(HydraID actorID);
glm::vec3 GetActorOrientation(HydraID actorID);
glm::vec3 GetActorVelocity(HydraID actorID);
};
template<class T>
inline HydraID HydraActorManager::CreateActor()
{
T* actorType = new T();
HydraActor* actor = dynamic_cast<HydraActor*>(actorType);
if (actor != nullptr)
{
HydraID actor_id = INVALID_HYDRA_ID;
{
std::lock_guard<std::mutex> lock(m_mutex);
actor_id = _SaveActor(actor);
}
if(actor_id != INVALID_HYDRA_ID)
{
actor->InitialiseComponents();
}
return actor_id;
}
else
{
return INVALID_HYDRA_ID;
}
}
#endif /* HYDRAACTORMANAGER */