Atoms Crowd  4.1.0
Agent.h
1 #pragma once
2 // ===========================================================================
3 // Copyright (c) 2015 Toolchefs Ltd. All rights reserved.
4 //
5 // Use of this software is subject to the terms of the Toolchefs license
6 // agreement provided at the time of installation or download, or which
7 // otherwise accompanies this software in either electronic or hard copy form.
8 // ===========================================================================
9 
10 #include <Atoms/Globals.h>
11 #include <Atoms/AgentType.h>
12 #include <AtomsCore/Pose.h>
13 #include <AtomsCore/Metadata/MapMetadata.h>
14 #include <AtomsCore/Metadata/Vector3Metadata.h>
15 #include <AtomsCore/Metadata/IntMetadata.h>
16 #include <AtomsCore/Metadata/BoolMetadata.h>
17 #include <AtomsCore/Metadata/DoubleMetadata.h>
18 #include <AtomsCore/Metadata/StringMetadata.h>
19 #include <AtomsCore/Metadata/MatrixArrayMetadata.h>
20 #include <AtomsCore/Metadata/QuaternionMetadata.h>
21 #include <AtomsCore/Metadata/FloatArrayMetadata.h>
22 #include <AtomsCore/Metadata/Vector3ArrayMetadata.h>
23 #include <AtomsCore/Serialiser.h>
24 #include <Atoms/Graph/AgentBehaviourNetwork.h>
25 #include <mutex>
26 
27 namespace Atoms
28 {
30  class AgentsPool;
31 
33 
37  class ATOMS_EXPORT Agent
38  {
39  public:
40 
42  ~Agent();
43 
45 
48  inline const AgentTypeCPtr& agentType() const;
49 
51 
54  void setAgentType(AgentTypeCPtr agentType);
55 
57 
60  inline AtomsCore::Pose& pose();
61 
63 
66  inline const AtomsCore::Pose& pose() const;
67 
69  inline void setPose(const AtomsCore::Pose& value);
70 
72 
76  void computePose(double simTime = 0.0);
77 
79 
82  inline AtomsCore::MapMetadata& metadata();
83 
85 
88  inline const AtomsCore::MapMetadata& metadata() const;
89 
91  inline void setMetadata(const AtomsCore::MapMetadata& value);
92 
94  /*
95  \return The agent behaviour network
96  */
97  inline AgentBehaviourNetwork& network();
98 
100  size_t memSize() const;
101 
104 
107 
109  /*
110  \return The agent bounding box
111  */
112  inline AtomsCore::Box3 boundingBox() const;
113 
115  /*
116  \param box The agent bounding box
117  */
118  inline void setBoundingBox(const AtomsCore::Box3& box);
119 
121  inline AtomsCore::Rand48& random();
122 
124  void reset();
125 
127  inline size_t profileTime() const;
128 
130  inline size_t profileThreadId() const;
131 
133  inline void setProfileThreadBatch(size_t value);
134 
136  inline size_t profileThreadBatch() const;
137 
139  void lock();
140 
142  void unlock();
143 
145  std::mutex& mutex();
146  public:
147 
148  AtomsPtr<AtomsCore::IntMetadata>& groupId();
149  AtomsPtr<AtomsCore::StringMetadata>& groupIdStr();
150  AtomsPtr<AtomsCore::IntMetadata>& id();
151  AtomsPtr<AtomsCore::Vector3Metadata>& position();
152  AtomsPtr<AtomsCore::Vector3Metadata>& scale();
153  AtomsPtr<AtomsCore::QuaternionMetadata>& rotation();
154  AtomsPtr<AtomsCore::Vector3Metadata>& direction();
155  AtomsPtr<AtomsCore::Vector3Metadata>& up();
156  AtomsPtr<AtomsCore::Vector3Metadata>& velocity();
157  AtomsPtr<AtomsCore::Vector3Metadata>& gravity();
158  AtomsPtr<AtomsCore::DoubleMetadata>& birth();
159  AtomsPtr<AtomsCore::IntMetadata>& state();
160  AtomsPtr<AtomsCore::IntMetadata>& currentState();
161  AtomsPtr<AtomsCore::IntMetadata>& active();
162  AtomsPtr<AtomsCore::DoubleMetadata>& frameRate();
163  AtomsPtr<AtomsCore::DoubleMetadata>& frameRateOverride();
164  AtomsPtr<AtomsCore::BoolMetadata>& disableIk();
165  AtomsPtr<AtomsCore::BoolMetadata>& disableFootLock();
166  AtomsPtr<AtomsCore::IntMetadata>& syncLevel();
167  AtomsPtr<AtomsCore::IntMetadata>& animationMode();
168  AtomsPtr<AtomsCore::Metadata>& animState();
169  AtomsPtr<AtomsCore::BoolMetadata>& forceClipTransition();
170  AtomsPtr<AtomsCore::BoolMetadata>& visible();
171  AtomsPtr<AtomsCore::DoubleMetadata>& linearVelocity();
172  AtomsPtr<AtomsCore::DoubleMetadata>& angularVelocity();
173  AtomsPtr<AtomsCore::BoolMetadata>& locomotionActive();
174  AtomsPtr<AtomsCore::Vector3Metadata>& velocityOverride();
175  AtomsPtr<AtomsCore::BoolMetadata>& useVelocityOverride();
176 #ifdef ATOMS_UNREAL
177  AtomsPtr<AtomsCore::IntMetadata>& _atypeid();
178  AtomsPtr<AtomsCore::BoolMetadata>& _culled();
179  AtomsPtr<AtomsCore::MatrixArrayMetadata>& _wm();
180  AtomsPtr<AtomsCore::DoubleMetadata>& maxSimDistance(double defaultValue);
181  AtomsPtr<AtomsCore::FloatArrayMetadata>& perInstanceMetadata();
182 #endif
183  AtomsPtr<AtomsCore::Vector3Metadata>& _navtp();
184  AtomsPtr<AtomsCore::Vector3ArrayMetadata>& _navfp();
185 
186  AtomsPtr<const AtomsCore::IntMetadata> groupId() const;
187  AtomsPtr<const AtomsCore::StringMetadata> groupIdStr() const;
188  AtomsPtr<const AtomsCore::IntMetadata> id() const;
189  AtomsPtr<const AtomsCore::Vector3Metadata> position() const;
190  AtomsPtr<const AtomsCore::Vector3Metadata> scale() const;
191  AtomsPtr<const AtomsCore::QuaternionMetadata> rotation() const;
192  AtomsPtr<const AtomsCore::Vector3Metadata> direction() const;
193  AtomsPtr<const AtomsCore::Vector3Metadata> up() const;
194  AtomsPtr<const AtomsCore::Vector3Metadata> velocity() const;
195  AtomsPtr<const AtomsCore::Vector3Metadata> gravity() const;
196  AtomsPtr<const AtomsCore::DoubleMetadata> birth() const;
197  AtomsPtr<const AtomsCore::IntMetadata> state() const;
198  AtomsPtr<const AtomsCore::IntMetadata> currentState() const;
199  AtomsPtr<const AtomsCore::IntMetadata> active() const;
200  AtomsPtr<const AtomsCore::DoubleMetadata> frameRate() const;
201  AtomsPtr<const AtomsCore::DoubleMetadata> frameRateOverride() const;
202  AtomsPtr<const AtomsCore::BoolMetadata> disableIk() const;
203  AtomsPtr<const AtomsCore::BoolMetadata> disableFootLock() const;
204  AtomsPtr<const AtomsCore::IntMetadata> syncLevel() const;
205  AtomsPtr<const AtomsCore::IntMetadata> animationMode() const;
206  AtomsPtr<const AtomsCore::Metadata> animState() const;
207  AtomsPtr<const AtomsCore::BoolMetadata> forceClipTransition() const;
208  AtomsPtr<const AtomsCore::BoolMetadata> visible() const;
209  AtomsPtr<const AtomsCore::DoubleMetadata> linearVelocity() const;
210  AtomsPtr<const AtomsCore::DoubleMetadata> angularVelocity() const;
211  AtomsPtr<const AtomsCore::BoolMetadata> locomotionActive() const;
212  AtomsPtr<const AtomsCore::Vector3Metadata> velocityOverride() const;
213  AtomsPtr<const AtomsCore::BoolMetadata> useVelocityOverride() const;
214  AtomsPtr<const AtomsCore::Vector3Metadata> _navtp() const;
215  AtomsPtr<const AtomsCore::Vector3ArrayMetadata> _navfp() const;
216 
217  private:
218 
219  AtomsPtr<AtomsCore::IntMetadata> m_groupIdPtr;
220  AtomsPtr<AtomsCore::StringMetadata> m_groupIdStrPtr;
221  AtomsPtr<AtomsCore::IntMetadata> m_idPtr;
222  AtomsPtr<AtomsCore::Vector3Metadata> m_positionPtr;
223  AtomsPtr<AtomsCore::Vector3Metadata> m_scalePtr;
224  AtomsPtr<AtomsCore::QuaternionMetadata> m_rotationPtr;
225  AtomsPtr<AtomsCore::Vector3Metadata> m_directionPtr;
226  AtomsPtr<AtomsCore::Vector3Metadata> m_upPtr;
227  AtomsPtr<AtomsCore::Vector3Metadata> m_velocityPtr;
228  AtomsPtr<AtomsCore::Vector3Metadata> m_gravityPtr;
229  AtomsPtr<AtomsCore::DoubleMetadata> m_birthPtr;
230  AtomsPtr<AtomsCore::IntMetadata> m_statePtr;
231  AtomsPtr<AtomsCore::IntMetadata> m_currentStatePtr;
232  AtomsPtr<AtomsCore::IntMetadata> m_activePtr;
233  AtomsPtr<AtomsCore::DoubleMetadata> m_frameRatePtr;
234  AtomsPtr<AtomsCore::DoubleMetadata> m_frameRateOverridePtr;
235  AtomsPtr<AtomsCore::BoolMetadata> m_disableIkPtr;
236  AtomsPtr<AtomsCore::BoolMetadata> m_disableFootLockPtr;
237  AtomsPtr<AtomsCore::IntMetadata> m_syncLevelPtr;
238  AtomsPtr<AtomsCore::IntMetadata> m_animationModePtr;
239  AtomsPtr<AtomsCore::Metadata> m_animStatePtr;
240  AtomsPtr<AtomsCore::BoolMetadata> m_forceClipTransitionPtr;
241  AtomsPtr<AtomsCore::BoolMetadata> m_visiblePtr;
242  AtomsPtr<AtomsCore::DoubleMetadata> m_linearVelocityPtr;
243  AtomsPtr<AtomsCore::DoubleMetadata> m_angularVelocityPtr;
244  AtomsPtr<AtomsCore::BoolMetadata> m_locomotionActivePtr;
245  AtomsPtr<AtomsCore::Vector3Metadata> m_velocityOverridePtr;
246  AtomsPtr<AtomsCore::BoolMetadata> m_useVelocityOverridePtr;
247 #ifdef ATOMS_UNREAL
248  AtomsPtr<AtomsCore::IntMetadata> m_atypeidPtr;
249  AtomsPtr<AtomsCore::BoolMetadata> m_culledPtr;
250  AtomsPtr<AtomsCore::MatrixArrayMetadata> m_wmPtr;
251  AtomsPtr<AtomsCore::DoubleMetadata> m_maxSimDistancePtr;
252  AtomsPtr<AtomsCore::FloatArrayMetadata> m_perInstanceMetadata;
253 #endif
254 
255  AtomsPtr<AtomsCore::Vector3Metadata> m_navtpPtr;
256  AtomsPtr<AtomsCore::Vector3ArrayMetadata> m_navfpPtr;
257 
258  private:
259 
261 
265  explicit Agent(AgentTypeCPtr agentType = nullptr);
266 
268  Agent(const Agent&);
269 
271  Agent& operator=(const Agent&);
272 
274  AgentBehaviourNetwork m_network;
275 
277  AtomsCore::Pose m_pose;
278 
280  AtomsCore::MapMetadata m_metadata;
281 
283  AgentTypeCPtr m_agentType;
284 
286  AtomsCore::Box3 m_boundingBox;
287 
289  AtomsCore::Rand48 m_random;
290 
292  size_t m_profileTime;
293 
295  size_t m_profileThreadId;
296 
298  size_t m_profileThreadBatch;
299 
300  std::mutex m_mutex;
301 
302  friend class AgentsPool;
303 
304  };
305 }
306 
307 namespace AtomsCore
308 {
309  ATOMS_EXPORT AtomsCore::Archive& operator<<(AtomsCore::Archive& os, const Atoms::Agent& agent);
310 
311  ATOMS_EXPORT AtomsCore::Archive& operator >> (AtomsCore::Archive& is, Atoms::Agent& agent);
312 }
313 #include "Agent.impl.h"
Atoms::Agent::memSize
size_t memSize() const
Gets the memory size of this agent.
Atoms::Agent::computeBoundingBox
void computeBoundingBox()
Computes the agent bounding box.
Atoms::AgentBehaviourNetwork
Agent behaviour network.
Definition: AgentBehaviourNetwork.h:29
Atoms::Agent::lock
void lock()
lock the agent mutex
Atoms::Agent::~Agent
~Agent()
Destructor.
Atoms::Agent::mutex
std::mutex & mutex()
Agent mutex.
AtomsCore::Archive
Archive class.
Definition: Serialiser.h:29
AtomsCore::Box3
AtomsMath::Box3 Box3
Bounding box class.
Definition: AtomsMath.h:74
Atoms::Agent
Agent.
Definition: Agent.h:38
Atoms::Agent::unlock
void unlock()
unlock the agent mutex
Atoms::Agent::computeMeshBoundingBox
void computeMeshBoundingBox()
Compute the bounding box using the skinned meshes.
Atoms
Atoms namespace.
Definition: Agent.h:28
AtomsCore
AtomsCore namespace.
Definition: AtomsMath.h:24
AtomsCore::MapMetadata
MapMetadata class.
Definition: MapMetadata.h:24
Atoms::Agent::setAgentType
void setAgentType(AgentTypeCPtr agentType)
Sets the agent type.
AtomsCore::Pose
Pose class.
Definition: Pose.h:32
Atoms::Agent::reset
void reset()
Reset the agent.
Atoms::Agent::computePose
void computePose(double simTime=0.0)
Computes the agent pose.
Atoms::AgentTypeCPtr
AtomsPtr< const AgentType > AgentTypeCPtr
Agent type const pointer.
Definition: AgentType.h:21
Atoms::AgentsPool
Agents pool.
Definition: AgentsPool.h:24