Grail (C++)  1.1.1
A multi-platform, modular, universal engine for embedding advanced AI in games.
AIManager.hh
1 #ifndef GRAIL_AI_MANAGER_H
2 #define GRAIL_AI_MANAGER_H
3 
4 #include "AIEntity.hh"
5 #include "EntityGroup.h"
6 #include "SynchronizedEntityContainer.h"
7 
8 #include <condition_variable>
9 #include <map>
10 #include <queue>
11 #include <set>
12 #include <thread>
13 
14 namespace grail
15 {
17  {
18  public:
19  IEntityChangeObserver() = default;
22  IEntityChangeObserver& operator=(const IEntityChangeObserver&) = delete;
23  IEntityChangeObserver& operator=(IEntityChangeObserver&&) = delete;
24  virtual ~IEntityChangeObserver() = default;
25 
26  virtual void OnEntityAdded(const AIManager& manager, AIEntity& entity) = 0;
27  virtual void OnEntityRemoved(const AIManager& manager, size_t entityId) = 0;
28  };
29 
33  class AIManager final
34  {
35  public:
40  AIManager(std::size_t threadsNumber = 0);
41  ~AIManager();
42 
46  void UpdateReasoners();
47 
52  void UpdateEntities(float deltaTime);
53 
59  void RegisterAIEntity(const std::shared_ptr<AIEntity>& entity, int priority);
60 
67  void RegisterAIEntity(const std::shared_ptr<AIEntity>& entity,
68  const std::shared_ptr<AIEntity>& parent,
69  int priorityOffset = 1);
70 
75  void RemoveAIEntity(const AIEntity* entity);
76 
77  void RegisterEntityGroup(const std::shared_ptr<EntityGroup>& entityGroup, int priority);
78  void RemoveEntityGroup(const std::shared_ptr<EntityGroup>& entityGroup);
79 
80  bool ContainsEntity(const AIEntity& entity) const;
81 
87  Blackboard& CreateBlackboard(const std::string& name);
88 
94  void SubscribeToBlackboard(const std::string& blackboardName, AIEntity& entity);
95 
96  void UnsubscribeFromBlackboard(const std::string& blackboardName, AIEntity& entity);
97 
98  void RegisterEntityChangeObserver(IEntityChangeObserver* observer);
99  void RemoveEntityChangeObserver(IEntityChangeObserver* observer);
100 
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;
104 
105  private:
106  void RequestProcessingEntities();
107  void ThreadUpdate(std::size_t id);
108  void SortEntities();
109  void RemoveEntities();
110  void RegisterEntity(const std::shared_ptr<AIEntity>& entity, int priority);
111  std::shared_ptr<EntityGroup>& RegisterEntityGroup(const std::string& groupName,
112  int groupPriority,
113  const std::vector<std::pair<std::shared_ptr<AIEntity>, int>>&
114  entityPriorityPairs,
115  const std::map<std::string, std::shared_ptr<Blackboard>>&
116  nameBlackboardPairs);
117 
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{};
121 
122  SynchronizedEntityContainer processedEntities{};
123  std::atomic<bool> shouldTerminateWorkers = {0};
124 
125  std::vector<std::thread> threads{};
126  std::mutex blackboardMutex{};
127  std::mutex entityRemovalMutex{};
128 
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;
134  };
135 }
136 #endif //GRAIL_AI_MANAGER_H
grail::AIManager::RegisterAIEntity
void RegisterAIEntity(const std::shared_ptr< AIEntity > &entity, int priority)
RegisterAIEntity - Manager registers entity with given priority.
Definition: AIManager.cpp:117
grail::AIEntity
The AIEntity class - Defines a basic object which can execute behaviors.
Definition: AIEntity.hh:39
grail::AIManager
The AIManager class - Manages registered entities and shared blackboards.
Definition: AIManager.hh:33
grail::AIManager::AIManager
AIManager(std::size_t threadsNumber=0)
AIManager - Constructs manager and spawns worker threads defined by parameter. If threadsNumber equal...
Definition: AIManager.cpp:8
grail::AIManager::UpdateEntities
void UpdateEntities(float deltaTime)
UpdateEntities - Updates entities and their assigned behaviors.
Definition: AIManager.cpp:103
grail::AIManager::CreateBlackboard
Blackboard & CreateBlackboard(const std::string &name)
CreateBlackboard - Constructs blackboard owned by this manager.
Definition: AIManager.cpp:294
grail::Blackboard
The Blackboard class - grail's universal data container.
Definition: Blackboard.hh:20
grail::AIManager::RemoveAIEntity
void RemoveAIEntity(const AIEntity *entity)
RemoveAIEntity - Manager caches given entity. Later on all cached entities will be unregistered from ...
Definition: AIManager.cpp:179
grail::IEntityChangeObserver
Definition: AIManager.hh:16
grail::AIManager::SubscribeToBlackboard
void SubscribeToBlackboard(const std::string &blackboardName, AIEntity &entity)
SubscribeToBlackboard - Subscribes given entity to blackboard identified by blackboard name and owned...
Definition: AIManager.cpp:302
grail::AIManager::UpdateReasoners
void UpdateReasoners()
UpdateReasoners - Lets registered entities think by updating their reasoner.
Definition: AIManager.cpp:79
grail::SynchronizedEntityContainer
Definition: SynchronizedEntityContainer.h:12