Grail (C++)  1.2.0
A multi-platform, modular, universal engine for embedding advanced AI in games.
AIManager.hh
1 // Copyright QED Software 2023.
2 
3 #ifndef GRAIL_AI_MANAGER_H
4 #define GRAIL_AI_MANAGER_H
5 
6 #include "AIEntity.hh"
7 #include "EntityGroup.h"
8 #include "SynchronizedEntityContainer.h"
9 
10 #include <condition_variable>
11 #include <map>
12 #include <queue>
13 #include <set>
14 #include <thread>
15 
16 namespace grail
17 {
19  {
20  public:
21  IEntityChangeObserver() = default;
24  IEntityChangeObserver& operator=(const IEntityChangeObserver&) = delete;
25  IEntityChangeObserver& operator=(IEntityChangeObserver&&) = delete;
26  virtual ~IEntityChangeObserver() = default;
27 
28  virtual void OnEntityAdded(const AIManager& manager, AIEntity& entity) = 0;
29  virtual void OnEntityRemoved(const AIManager& manager, size_t entityId) = 0;
30  };
31 
35  class AIManager final
36  {
37  public:
42  AIManager(std::size_t threadsNumber = 0);
43  ~AIManager();
44 
48  void UpdateReasoners();
49 
54  void UpdateEntities(float deltaTime);
55 
61  void RegisterAIEntity(const std::shared_ptr<AIEntity>& entity, int priority);
62 
69  void RegisterAIEntity(const std::shared_ptr<AIEntity>& entity,
70  const std::shared_ptr<AIEntity>& parent,
71  int priorityOffset = 1);
72 
77  void RemoveAIEntity(AIEntity* entity);
78 
79  void RegisterEntityGroup(const std::shared_ptr<EntityGroup>& entityGroup, int priority);
80  void RemoveEntityGroup(const std::shared_ptr<EntityGroup>& entityGroup);
81 
82  bool ContainsEntity(const AIEntity& entity) const;
83 
89  Blackboard& CreateBlackboard(const std::string& name);
90 
96  void SubscribeToBlackboard(const std::string& blackboardName, AIEntity& entity);
97 
98  void UnsubscribeFromBlackboard(const std::string& blackboardName, AIEntity& entity);
99 
100  void RegisterEntityChangeObserver(IEntityChangeObserver* observer);
101  void RemoveEntityChangeObserver(IEntityChangeObserver* observer);
102 
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;
106 
107  private:
108  EntityToken WaitForAcquiringEntity(AIEntity& entity) const;
109  void RequestProcessingEntities();
110  void ThreadUpdate(std::size_t id);
111  void SortEntities();
112  void RemoveEntities();
113  void RegisterEntity(const std::shared_ptr<AIEntity>& entity, int priority);
114  std::shared_ptr<EntityGroup>& RegisterEntityGroup(const std::string& groupName,
115  int groupPriority,
116  const std::vector<std::pair<std::shared_ptr<AIEntity>, int>>&
117  entityPriorityPairs,
118  const std::map<std::string, std::shared_ptr<Blackboard>>&
119  nameBlackboardPairs);
120 
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{};
124 
125  SynchronizedEntityContainer processedEntities{};
126  std::atomic<bool> shouldTerminateWorkers = {0};
127 
128  std::vector<std::thread> threads{};
129  std::mutex blackboardMutex{};
130  mutable std::mutex entitiesMutex{};
131 
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;
137  };
138 }
139 #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:143
grail::AIManager::RemoveAIEntity
void RemoveAIEntity(AIEntity *entity)
RemoveAIEntity - Manager caches given entity. Later on all cached entities will be unregistered from ...
Definition: AIManager.cpp:197
grail::AIEntity
The AIEntity class - Defines a basic object which can execute behaviors.
Definition: AIEntity.hh:50
grail::AIManager
The AIManager class - Manages registered entities and shared blackboards.
Definition: AIManager.hh:35
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:12
grail::AIManager::UpdateEntities
void UpdateEntities(float deltaTime)
UpdateEntities - Updates entities and their assigned behaviors.
Definition: AIManager.cpp:126
grail::AIManager::CreateBlackboard
Blackboard & CreateBlackboard(const std::string &name)
CreateBlackboard - Constructs blackboard owned by this manager.
Definition: AIManager.cpp:321
grail::Blackboard
The Blackboard class - grail's universal data container.
Definition: Blackboard.hh:22
grail::EntityToken
Definition: EntityToken.hh:8
grail::IEntityChangeObserver
Definition: AIManager.hh:18
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:329
grail::AIManager::UpdateReasoners
void UpdateReasoners()
UpdateReasoners - Lets registered entities think by updating their reasoner.
Definition: AIManager.cpp:90
grail::SynchronizedEntityContainer
Definition: SynchronizedEntityContainer.h:15