97 lines
2.7 KiB
C++
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 */
|