Atoms Crowd  4.1.0
AnimationClip.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 <AtomsCore/AtomsMath.h>
12 #include <AtomsCore/Metadata/MetadataFactory.h>
13 #include <AtomsCore/Metadata/TypedArrayMetadata.h>
14 #include <AtomsCore/Metadata/ArrayMetadata.h>
15 #include <AtomsCore/Metadata/MapMetadata.h>
16 #include <AtomsCore/Metadata/Vector2ArrayMetadata.h>
17 #include <AtomsCore/Metadata/Vector3ArrayMetadata.h>
18 #include <AtomsCore/Skeleton.h>
19 #include <vector>
20 #include <map>
21 
22 #define DOUBLE_FOOT_DOWN_TRESHOLD 0.95
23 
24 namespace Atoms
25 {
26  class AnimationClip;
27  class JointClipData;
28 
29  typedef AtomsPtr<AnimationClip> AnimationClipPtr;
30 
31  typedef AtomsPtr<const AnimationClip> AnimationClipCPtr;
32 
34 
36  class ATOMS_EXPORT JointClipData
37  {
38 
39  public:
40 
42 
46  JointClipData(const unsigned int numberOfFrames);
47 
50 
52 
55  inline const std::string& name() const;
56  //inline const char* name() const;
57 
59 
62  inline void setName(const std::string& name);
63 
65 
68  unsigned int getNumberOfFrames() { return m_numberOfFrames; };
69 
71  void setNumberOfFrames(const int value);
72 
74  inline void setTranslation(const AtomsCore::Vector3 &translation, const unsigned int frame);
75 
77  inline void setRotation(const AtomsCore::Quaternion &rotation, const unsigned int frame);
78 
80  inline void setScale(const AtomsCore::Vector3 &scale, const unsigned int frame);
81 
83  const inline AtomsCore::Vector3& getTranslation(const unsigned int frame) const;
84 
86  const inline AtomsCore::Quaternion& getRotation(const unsigned int frame) const;
87 
89  const inline AtomsCore::Vector3& getScale(const unsigned int frame) const;
90 
92  AtomsCore::Vector3 getBlendedTranslation(const unsigned int initialFrame, const unsigned int finalFrame, const double weight) const;
93 
95  AtomsCore::Quaternion getBlendedRotation(const unsigned int initialFrame, const unsigned int finalFrame, const double weight) const;
96 
98  AtomsCore::Vector3 getBlendedScale(const unsigned int initialFrame, const unsigned int finalFrame, const double weight) const;
99 
101  void getBlendedTranslationInPlace(AtomsCore::Vector3& out, const unsigned int initialFrame, const unsigned int finalFrame, const double weight) const;
102 
104  void getBlendedRotationInPlace(AtomsCore::Quaternion& out, const unsigned int initialFrame, const unsigned int finalFrame, const double weight) const;
105 
107  void getBlendedScaleInPlace(AtomsCore::Vector3& out, const unsigned int initialFrame, const unsigned int finalFrame, const double weight) const;
108 
109  inline unsigned int getArrayMetadataType(const std::string &name) const;
110 
111  template <class T> inline void setArrayMetadataValue(const std::string &name, const unsigned int frame, T value);
112 
113  inline AtomsPtr<AtomsCore::Metadata> getArrayMetadataAtFrame(const std::string &name, const unsigned int frame) const;
114 
115  template <class T> inline T getArrayMetadataValueAtFrame(const std::string &name, const unsigned int frame) const;
116 
117  AtomsPtr<AtomsCore::Metadata> getBlendedArrayMetadata(const std::string &name, const unsigned int initialFrame, const unsigned int finalFrame, const double weight) const;
118 
119  bool getBlendedArrayMetadataInPlace(const std::string& name, const unsigned int initialFrame, const unsigned int finalFrame, const double weight, AtomsPtr<AtomsCore::Metadata>& OutMeta) const;
120 
121  template <class T> T& getBlendedArrayMetadataValue(const std::string &name, const unsigned int initialFrame, const unsigned int finalFrame, const double weight) const;
122 
123  AtomsPtr<AtomsCore::Metadata> getDoubleBlendedArrayMetadata(const std::string &name, const unsigned int initialFrame1, const unsigned int finalFrame1, const double weight1, const unsigned int initialFrame2, const unsigned int finalFrame2, const double weight2, const double finalWeight) const;
124  bool getDoubleBlendedArrayMetadataInPlace(const std::string& name, const unsigned int initialFrame1, const unsigned int finalFrame1, const double weight1, const unsigned int initialFrame2, const unsigned int finalFrame2, const double weight2, const double finalWeight, AtomsPtr<AtomsCore::Metadata>& OutMeta) const;
125 
126  inline std::vector<std::string> getArrayMetadataNames() const;
127 
128  template<class T> inline void addArrayMetadata(const std::string &name, const bool force = false);
129 
130  template<class T> inline void getArrayMetadataValues(const std::string& name, std::vector<T> &values);
131 
132  inline void addArrayMetadata(const std::string &name, AtomsPtr<AtomsCore::BaseTypedArrayMetadata>& data);
133 
134  inline bool hasArrayMetadata(const std::string &name) const;
135 
136  inline void deleteArrayMetadata(const std::string& name);
137 
138  inline std::vector<std::string> getStaticMetadataNames() const;
139 
140  inline void setStaticMetadata(const std::string &name, AtomsCore::Metadata &metadata);
141 
142  inline AtomsPtr<AtomsCore::Metadata> getStaticMetadata(const std::string &name);
143 
144  inline AtomsPtr<const AtomsCore::Metadata> getStaticMetadata(const std::string &name) const;
145 
146  inline AtomsCore::MapMetadata& staticMetadata();
147 
148  inline const AtomsCore::MapMetadata& staticMetadata() const;
149 
150  inline std::map<std::string, AtomsPtr<AtomsCore::BaseTypedArrayMetadata>>& metadata();
151 
152  inline const std::map<std::string, AtomsPtr<AtomsCore::BaseTypedArrayMetadata>>& metadata() const;
153 
154  // Revers the animation
155  void reverse();
156 
157  // Compute the transform animated tag and animated metadata
158  void computeIsAnimated();
159 
160  // Return true if this joint data has animations
161  inline bool isTransformAnimated() const;
162 
163  // Contains a list of all non static metadata
164  inline const std::vector<std::string>& animatedMetadata() const;
165 
166  // Add the metadata to the animated metadata list
167  void addAnimatedMetadata(const std::string& metadataName);
168 
169  void copyFrame(unsigned int from, unsigned int to);
170 
171  public:
172 
173  static bool getBindPoseData(
174  const Atoms::JointClipData& jcd,
175  int jointId,
176  AtomsCore::Vector3& bindTranslate,
177  AtomsCore::Vector3& bindScale,
178  AtomsCore::Quaternion& bindRotate,
179  AtomsCore::Quaternion& bindRotateOffset,
180  const AtomsCore::Skeleton& skeleton
181  );
182 
183  static bool getBindPoseData(
184  const AtomsCore::MapMetadata& jcd,
185  int jointId,
186  AtomsCore::Vector3& bindTranslate,
187  AtomsCore::Vector3& bindScale,
188  AtomsCore::Quaternion& bindRotate,
189  AtomsCore::Quaternion& bindRotateOffset,
190  const AtomsCore::Skeleton& skeleton
191  );
192 
193 
194  private:
195 
196  std::vector<AtomsCore::Vector3> m_translation;
197 
198  std::vector<AtomsCore::Quaternion> m_rotation;
199 
200  std::vector<AtomsCore::Vector3> m_scale;
201 
202  std::map<std::string, AtomsPtr<AtomsCore::BaseTypedArrayMetadata>> m_metadata;
203 
204  std::vector<std::string> m_animatedMetadata;
205 
206  AtomsCore::MapMetadata m_staticMetadata;
207 
208  std::string m_name;
209 
210  unsigned int m_numberOfFrames;
211 
212  bool m_isTransformAnimated;
213 
214  };
215 
217  class ATOMS_EXPORT AnimationClip
218  {
219 
220  public:
221 
222  enum DirectionType
223  {
224  kPelvis = 0,
225  kStatic,
226  kJoints,
227  kClip,
228  kLocal
229  };
230 
231  enum AdditiveMode
232  {
233  kDisabled = 0,
234  kBindPose,
235  kReferenceClip
236  };
237 
238  enum MirrorPlane
239  {
240  kX = 0,
241  kY,
242  kZ
243  };
244 
245  enum MirrorSideJointsSearch
246  {
247  kAuto = 0,
248  kByName
249  };
250 
253 
254  AnimationClip(const unsigned int numberOfJoints, const unsigned int numberOfFrames, const double fps);
255 
258 
260  inline int numJoints() const;
261 
263  inline int numFrames() const;
264 
266  void setNumFrames(const unsigned int numberOfFrames);
267 
269  inline double fps() const;
270 
272  inline void setFps(double value);
273 
275  inline unsigned int mapTimeToFrame(const double time, double &reminder) const;
276 
278  inline void setJointName(const unsigned int index, const std::string &jointName);
279 
281  inline int jointId(const std::string& jointName) const;
282 
284  inline JointClipData& operator[](unsigned short index);
285 
287  inline const JointClipData& operator[](unsigned short index) const;
288 
290  inline JointClipData& at(unsigned short index);
291 
293  inline const JointClipData& at(unsigned short index) const;
294 
296  inline AtomsCore::MapMetadata& metadata();
297 
299  inline const AtomsCore::MapMetadata& metadata() const;
300 
302  inline void setDirection(const AtomsCore::Vector3& direction);
303 
305  inline AtomsCore::Vector3 direction() const;
306 
308  /* if directionType is kStatic then the clip use alway the direction saved by the setDireciton function,
309  otherwise it takes the direction form the pelvis
310  */
311  inline void setDirectionType(unsigned int directionType);
312 
314  inline unsigned int directionType() const;
315 
317  inline void setDirectionFromJoints(unsigned int fromJoint, unsigned int toJoint);
318 
320  inline const std::pair<unsigned int, unsigned int>& directionFromJoints() const;
321 
323  inline void disableFootLock(bool value);
324 
326  inline bool isFootLockDisabled() const;
327 
329  inline const std::vector<int>& transitionFrames() const;
330 
332  void setTransitionFrames(const std::vector<int>& frames);
333 
335  void setCompatibleAgentType(const std::string &agentType);
336 
338  const std::string& getCompatibleAgentType() const;
339 
341  void setGlobalIKData(const std::string& jointName, const AtomsCore::Vector2ArrayMetadata& data);
342 
344  void setPerchingData(const AtomsCore::Vector2ArrayMetadata& data);
345 
347  void setSittingData(const AtomsCore::Vector2ArrayMetadata& data);
348 
350  void setFootDownData(const std::string& jointName, const AtomsCore::Vector2ArrayMetadata& data);
351 
353  void addJointMetadata(const std::string& metadataName, const std::string& jointName, const int metadataType, const AtomsCore::Vector2ArrayMetadata& data);
354 
356  void setAdditiveMode(const unsigned int additiveMode);
357 
359  void setAdditiveReferenceClip(const std::string &clipName);
360 
362  inline unsigned int additiveMode() const;
363 
365  inline const std::string & additiveReferenceClip() const;
366 
368  void cacheFrameRootRotation(const std::string &agentType);
369 
371  void computeClipDirections(const std::string& agentType, std::vector<AtomsCore::Vector3> &directions) const;
372 
374  /*
375  \param height global y coordinated of the ground
376  */
377  void computePelvisAndFeetHeight(double height);
378 
380  void reverse();
381 
383  /*
384  \param animMirrorPlane normal axis of the mirror plane in the animation
385  \param bindMirrorPlane normal axis of the mirror plane in bind pose
386  \param searchMode search mode to fin pair joints from left and right
387  \param left string identifier of joints on the left
388  \param right string identifier of joints on the right
389  \param rawMirror flag to don't use the differences in bind pose on left and right joints
390  */
392  const unsigned int animMirrorPlane,
393  const unsigned int bindMirrorPlane,
394  const unsigned int searchMode,
395  const std::string &left,
396  const std::string &right,
397  const bool rawMirror = false);
398 
400  /*
401  This function fills the transformAnimated and animatedMetadata members on each joint clip data
402  */
404 
406  /*
407  Replace . with _ inside the joint names
408  */
410 
412  double computeAverageVelocity() const;
413 
416 
419  const AtomsCore::Skeleton& skeleton,
420  int clampedFrame, double weight,
421  AtomsCore::JointCPtr pelvisJoint) const;
422 
424  /*
425  This function converts the atoms_footOnGround metadata from a bool array to a double array metadata
426  */
428 
429  private:
430 
432  std::vector<JointClipData> m_joints;
433 
435 
438  std::vector<int> m_transitionFrames;
439 
441  std::map<std::string, unsigned int> m_jointIndex;
442 
444  AtomsCore::MapMetadata m_metadata;
445 
447  double m_fps;
448 
450  unsigned int m_numberOfFrames;
451 
453  AtomsCore::Vector3 m_direction;
454 
456  std::pair<unsigned int, unsigned int> m_directionFromJoints;
457 
459  unsigned int m_directionType;
460 
462  bool m_isFootLockDisabled;
463 
465  std::string m_compatibleAgentType;
466 
468  unsigned int m_additiveMode;
469 
471  std::string m_additiveReferenceClip;
472 
474  bool m_frameRootRotationCached;
475  };
476 }
477 
478 
479 #include "AnimationClip.impl.h"
Atoms::AnimationClip::addJointMetadata
void addJointMetadata(const std::string &metadataName, const std::string &jointName, const int metadataType, const AtomsCore::Vector2ArrayMetadata &data)
Add a joint metadata.
Atoms::AnimationClip::setFootDownData
void setFootDownData(const std::string &jointName, const AtomsCore::Vector2ArrayMetadata &data)
Set foot data for a specific joint.
Atoms::JointClipData::getBlendedScaleInPlace
void getBlendedScaleInPlace(AtomsCore::Vector3 &out, const unsigned int initialFrame, const unsigned int finalFrame, const double weight) const
Gets blended scale between two frames.
Atoms::AnimationClip::setNumFrames
void setNumFrames(const unsigned int numberOfFrames)
Sets the number of frames.
AtomsCore::Quaternion
AtomsMath::Quaternion Quaternion
Quaternion class.
Definition: AtomsMath.h:67
Atoms::JointClipData::~JointClipData
~JointClipData()
Destructr.
Atoms::AnimationClip::clipJointWorldMatrix
AtomsCore::Matrix clipJointWorldMatrix(const AtomsCore::Skeleton &skeleton, int clampedFrame, double weight, AtomsCore::JointCPtr pelvisJoint) const
Get a world matrix form the clip.
Atoms::AnimationClip::setTransitionFrames
void setTransitionFrames(const std::vector< int > &frames)
Get the transition frames.
Atoms::JointClipData::setNumberOfFrames
void setNumberOfFrames(const int value)
set number of frames
Atoms::AnimationClip::setCompatibleAgentType
void setCompatibleAgentType(const std::string &agentType)
Set compatible agent type name.
AtomsCore::Metadata
Base Metadata class.
Definition: Metadata.h:24
Atoms::JointClipData::getNumberOfFrames
unsigned int getNumberOfFrames()
get number of frames
Definition: AnimationClip.h:68
Atoms::AnimationClip::reverse
void reverse()
Reverse clip.
Atoms::AnimationClip::computePelvisAndFeetHeight
void computePelvisAndFeetHeight(double height)
COmpute the the pelvis and feet height.
Atoms::AnimationClip::setAdditiveMode
void setAdditiveMode(const unsigned int additiveMode)
Set the additive mode.
Atoms::AnimationClip::AnimationClip
AnimationClip()
Constructor.
AtomsCore::Matrix
AtomsMath::Matrix Matrix
Matrix class.
Definition: AtomsMath.h:63
AtomsCore::Vector3
AtomsMath::Vector3 Vector3
Vector3 class.
Definition: AtomsMath.h:57
Atoms::JointClipData::getBlendedTranslationInPlace
void getBlendedTranslationInPlace(AtomsCore::Vector3 &out, const unsigned int initialFrame, const unsigned int finalFrame, const double weight) const
Gets blended translation between two frames.
Atoms::AnimationClip::setGlobalIKData
void setGlobalIKData(const std::string &jointName, const AtomsCore::Vector2ArrayMetadata &data)
Set global ik data for a specific joint.
Atoms::AnimationClipCPtr
AtomsPtr< const AnimationClip > AnimationClipCPtr
animation clip const pointer
Definition: AnimationClip.h:31
AtomsCore::Joint
Joint class.
Definition: Joint.h:30
Atoms::AnimationClip::computeAverageAngularVelocity
double computeAverageAngularVelocity() const
Get the mean angular velocity of this clip.
Atoms
Atoms namespace.
Definition: Agent.h:28
AtomsCore::MapMetadata
MapMetadata class.
Definition: MapMetadata.h:24
Atoms::JointClipData::getBlendedRotation
AtomsCore::Quaternion getBlendedRotation(const unsigned int initialFrame, const unsigned int finalFrame, const double weight) const
Gets blended rotation between two frames.
Atoms::AnimationClip::setSittingData
void setSittingData(const AtomsCore::Vector2ArrayMetadata &data)
Set perching data on the joint root.
Atoms::JointClipData::getBlendedTranslation
AtomsCore::Vector3 getBlendedTranslation(const unsigned int initialFrame, const unsigned int finalFrame, const double weight) const
Gets blended translation between two frames.
Atoms::JointClipData::getBlendedScale
AtomsCore::Vector3 getBlendedScale(const unsigned int initialFrame, const unsigned int finalFrame, const double weight) const
Gets blended scale between two frames.
Atoms::AnimationClip::computeMirror
void computeMirror(const unsigned int animMirrorPlane, const unsigned int bindMirrorPlane, const unsigned int searchMode, const std::string &left, const std::string &right, const bool rawMirror=false)
Compute the mirror of the clip in the given mirror plane.
Atoms::AnimationClip::computeAnimatedJoints
void computeAnimatedJoints()
Compute the animated joints.
Atoms::JointClipData::JointClipData
JointClipData(const unsigned int numberOfFrames)
Cosntructor.
Atoms::JointClipData
Joint Clip data.
Definition: AnimationClip.h:37
Atoms::AnimationClip
Animation clip.
Definition: AnimationClip.h:218
AtomsCore::Skeleton
Skeleton class.
Definition: Skeleton.h:68
Atoms::AnimationClip::conformFootDownDataForLocomotion
void conformFootDownDataForLocomotion()
Conforms the foot down data for locomotion.
Atoms::AnimationClip::sanitizeJointNames
void sanitizeJointNames()
Sanitize joint names.
Atoms::AnimationClip::cacheFrameRootRotation
void cacheFrameRootRotation(const std::string &agentType)
Cache frame root rotation.
Atoms::JointClipData::getBlendedRotationInPlace
void getBlendedRotationInPlace(AtomsCore::Quaternion &out, const unsigned int initialFrame, const unsigned int finalFrame, const double weight) const
Gets blended rotation between two frames.
Atoms::AnimationClip::~AnimationClip
~AnimationClip()
Destructor.
Definition: AnimationClip.h:257
Atoms::AnimationClip::getCompatibleAgentType
const std::string & getCompatibleAgentType() const
Get compatible agent type name.
Atoms::AnimationClip::computeClipDirections
void computeClipDirections(const std::string &agentType, std::vector< AtomsCore::Vector3 > &directions) const
Compute and returns the clip directions.
Atoms::AnimationClip::setPerchingData
void setPerchingData(const AtomsCore::Vector2ArrayMetadata &data)
Set perching data on the joint root.
Atoms::AnimationClipPtr
AtomsPtr< AnimationClip > AnimationClipPtr
animation clip pointer
Definition: AnimationClip.h:27
Atoms::AnimationClip::setAdditiveReferenceClip
void setAdditiveReferenceClip(const std::string &clipName)
Set additive reference clip.
Atoms::AnimationClip::computeAverageVelocity
double computeAverageVelocity() const
Get the mean velocity of this clip.