3 #ifndef GRAIL_AI_MANAGER_H
4 #define GRAIL_AI_MANAGER_H
7 #include "EntityGroup.h"
8 #include "SynchronizedEntityContainer.h"
10 #include <condition_variable>
29 virtual void OnEntityRemoved(
const AIManager& manager,
size_t entityId) = 0;
61 void RegisterAIEntity(
const std::shared_ptr<AIEntity>& entity,
int priority);
70 const std::shared_ptr<AIEntity>& parent,
71 int priorityOffset = 1);
79 void RegisterEntityGroup(
const std::shared_ptr<EntityGroup>& entityGroup,
int priority);
80 void RemoveEntityGroup(
const std::shared_ptr<EntityGroup>& entityGroup);
82 bool ContainsEntity(
const AIEntity& entity)
const;
98 void UnsubscribeFromBlackboard(
const std::string& blackboardName,
AIEntity& entity);
103 const std::vector<std::pair<std::shared_ptr<AIEntity>,
int>>& GetEntities()
const;
104 const std::vector<std::shared_ptr<EntityGroup>>& GetEntityGroups()
const;
105 const std::map<std::string, std::shared_ptr<Blackboard>>& GetSharedBlackboards()
const;
109 void RequestProcessingEntities();
110 void ThreadUpdate(std::size_t
id);
112 void RemoveEntities();
113 void RegisterEntity(
const std::shared_ptr<AIEntity>& entity,
int priority);
114 std::shared_ptr<EntityGroup>& RegisterEntityGroup(
const std::string& groupName,
116 const std::vector<std::pair<std::shared_ptr<AIEntity>,
int>>&
118 const std::map<std::string, std::shared_ptr<Blackboard>>&
119 nameBlackboardPairs);
121 std::vector<std::pair<std::shared_ptr<AIEntity>,
int>> entities{};
122 std::set<AIEntity*> entitiesToRemove{};
123 std::map<std::string, std::shared_ptr<Blackboard>> sharedBlackboards{};
126 std::atomic<bool> shouldTerminateWorkers = {0};
128 std::vector<std::thread> threads{};
129 std::mutex blackboardMutex{};
130 mutable std::mutex entitiesMutex{};
132 size_t nextEntityId = 0;
133 size_t nextEntityGroupId = 0;
134 std::vector<std::shared_ptr<EntityGroup>> entityGroups{};
135 std::vector<IEntityChangeObserver*> entityChangeObservers{};
136 std::shared_ptr<EntityGroup> ungroupedEntities;
139 #endif //GRAIL_AI_MANAGER_H