1 #ifndef GRAIL_AI_MANAGER_H
2 #define GRAIL_AI_MANAGER_H
5 #include "EntityGroup.h"
6 #include "SynchronizedEntityContainer.h"
8 #include <condition_variable>
27 virtual void OnEntityRemoved(
const AIManager& manager,
size_t entityId) = 0;
59 void RegisterAIEntity(
const std::shared_ptr<AIEntity>& entity,
int priority);
68 const std::shared_ptr<AIEntity>& parent,
69 int priorityOffset = 1);
77 void RegisterEntityGroup(
const std::shared_ptr<EntityGroup>& entityGroup,
int priority);
78 void RemoveEntityGroup(
const std::shared_ptr<EntityGroup>& entityGroup);
80 bool ContainsEntity(
const AIEntity& entity)
const;
96 void UnsubscribeFromBlackboard(
const std::string& blackboardName,
AIEntity& entity);
101 const std::vector<std::pair<std::shared_ptr<AIEntity>,
int>>& GetEntities()
const;
102 const std::vector<std::shared_ptr<EntityGroup>>& GetEntityGroups()
const;
103 const std::map<std::string, std::shared_ptr<Blackboard>>& GetSharedBlackboards()
const;
106 void RequestProcessingEntities();
107 void ThreadUpdate(std::size_t
id);
109 void RemoveEntities();
110 void RegisterEntity(
const std::shared_ptr<AIEntity>& entity,
int priority);
111 std::shared_ptr<EntityGroup>& RegisterEntityGroup(
const std::string& groupName,
113 const std::vector<std::pair<std::shared_ptr<AIEntity>,
int>>&
115 const std::map<std::string, std::shared_ptr<Blackboard>>&
116 nameBlackboardPairs);
118 std::vector<std::pair<std::shared_ptr<AIEntity>,
int>> entities{};
119 std::set<const AIEntity*> entitiesToRemove{};
120 std::map<std::string, std::shared_ptr<Blackboard>> sharedBlackboards{};
123 std::atomic<bool> shouldTerminateWorkers = {0};
125 std::vector<std::thread> threads{};
126 std::mutex blackboardMutex{};
127 std::mutex entityRemovalMutex{};
129 size_t nextEntityId = 0;
130 size_t nextEntityGroupId = 0;
131 std::vector<std::shared_ptr<EntityGroup>> entityGroups{};
132 std::vector<IEntityChangeObserver*> entityChangeObservers{};
133 std::shared_ptr<EntityGroup> ungroupedEntities;
136 #endif //GRAIL_AI_MANAGER_H