Program Listing for File ecs_factory.h¶
↰ Return to documentation for file (rootex/framework/ecs_factory.h
)
#pragma once
#include "common/common.h"
#include "core/resource_files/text_resource_file.h"
#include "scene.h"
#include "entity.h"
#include "utility/component_array.h"
typedef unsigned int ComponentID;
class Component;
class BaseComponentSet
{
public:
virtual bool addComponent(Entity& owner, const JSON::json& componentData, bool checks = true) = 0;
virtual bool addDefaultComponent(Entity& owner, bool checks) = 0;
virtual bool removeComponent(Entity& entity) = 0;
virtual const String& getName() const = 0;
virtual const String& getCategory() const = 0;
virtual const ComponentID& getID() const = 0;
};
template <class T>
class ComponentSet : public BaseComponentSet
{
ComponentArray<T> m_Instances;
public:
ComponentSet() = default;
ComponentSet(const ComponentSet&) = delete;
ComponentSet& operator=(const ComponentSet&) = delete;
ComponentArray<T>& getAll() { return m_Instances; }
bool addComponent(Entity& owner, const JSON::json& componentData, bool checks) override
{
if (!owner.hasComponent(T::s_ID))
{
m_Instances.emplace_back(owner, componentData);
if (checks && !owner.onAllComponentsAdded())
{
if (owner.hasComponent(T::s_ID))
{
owner.removeComponent(T::s_ID, true);
}
return false;
}
return true;
}
WARN("Entity already has a " + T::s_Name + ": " + owner.getFullName());
return false;
}
bool addDefaultComponent(Entity& owner, bool checks) override
{
return addComponent(owner, JSON::json::object(), checks);
}
bool removeComponent(Entity& entity) override
{
return m_Instances.erase(entity);
}
const String& getName() const override { return T::s_Name; };
const String& getCategory() const override { return T::s_Category; };
const ComponentID& getID() const override { return T::s_ID; };
};
namespace ECSFactory
{
extern HashMap<String, Ptr<BaseComponentSet>> s_ComponentSets;
void Initialize();
void FillEntity(Entity& entity, const JSON::json& entityJSON);
void FillEntityFromFile(Entity& entity, TextResourceFile* textResourceFile);
void FillRootEntity(Entity& root);
void CopyEntity(Entity& entity, Entity& copyTarget);
String GetComponentNameByID(ComponentID componentID);
ComponentID GetComponentIDByName(const String& componentName);
bool AddComponent(Entity& entity, ComponentID componentID, const JSON::json& componentData, bool checks = true);
bool AddDefaultComponent(Entity& entity, ComponentID componentID, bool checks = true);
bool RemoveComponent(Entity& entity, ComponentID componentID);
};