#ifndef HYDRAACTORMANAGER #define HYDRAACTORMANAGER #include "../engine/HydraObject.h" #include "../task/HydraTask.h" #include "HydraActor.h" #include #include #include #include #include // #include // C++ importer interface // #include // Output data structure // #include // Post processing flags class CLASS_DEFINE HydraActorManager : public HydraObject { private: std::mutex m_mutex; std::vector m_actors; std::deque m_available_actor_ids; std::deque m_actors_waiting_for_init; std::deque 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 HydraID CreateActor(); HydraID LoadActor(std::string filename); void DeleteActor(HydraID actorID); HydraActor* const GetActor(HydraID actorID); std::vector& 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 inline HydraID HydraActorManager::CreateActor() { T* actorType = new T(); HydraActor* actor = dynamic_cast(actorType); if (actor != nullptr) { HydraID actor_id = INVALID_HYDRA_ID; { std::lock_guard 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 */