Atoms Crowd  4.1.0
ClipReaderOperator.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 <AtomsGraph/Ports.h>
11 
12 #include <Atoms/Globals.h>
13 #include <Atoms/Graph/Operator.h>
14 #include <Atoms/AnimationClipLooper.h>
15 #include <AtomsCore/Metadata/Vector3Metadata.h>
16 #include <AtomsCore/JointChain.h>
17 #include <Atoms/AgentType.h>
18 
19 namespace Atoms
20 {
21  class ATOMS_EXPORT ClipReaderOperator : public Operator
22  {
23  public:
24 
25  struct BindData
26  {
27  AtomsCore::Matrix rotation;
28  AtomsCore::Matrix matrix;
29  AtomsCore::Matrix inverseMatrix;
30  };
31 
32  NODE_STANDARD_MEMBERS
33 
35 
36  virtual ~ClipReaderOperator();
37 
38  bool compute(const AtomsGraph::ComputeData* computeData);
39 
40  void reset();
41 
42  void setupDefaultPose();
43 
44  void fillSkeletonClipIdMap(AnimationClipCPtr& clip, const AtomsCore::Skeleton& skeleton);
45 
46  double setPoseFromLooper(AnimationClipCPtr& clip, const AtomsCore::Skeleton& skeleton, AtomsCore::Pose& pose, double time, bool isAtomsClip, bool isParentSpace, const AtomsCore::SkeletonLod* skeletonLod);
47  void setPoseFromClip(AnimationClipCPtr& clip, const AtomsCore::Skeleton& skeleton, AtomsCore::Pose& pose, int clampedFrame, double weight, bool isAtomsClip, bool isParentSpace, const AtomsCore::SkeletonLod* skeletonLod);
48 
49  AtomsCore::Vector3 getPelvisVelocityFromClip(AnimationClipCPtr& clip, const AtomsCore::Skeleton& skeleton, AtomsCore::Pose& pose, int frame, double reminder, const AtomsCore::SkeletonLod* skeletonLod, const int newFrame, const double newReminder);
50  AtomsCore::Vector3 getPelvisVelocityFromLooper(AnimationClipCPtr& clip, const AtomsCore::Skeleton& skeleton, AtomsCore::Pose& pose, int frame, double reminder, const AtomsCore::SkeletonLod* skeletonLod, const int newFrame, const double newReminder);
51 
52  AtomsCore::Vector3 getDirectionAtFrame(AtomsCore::Poser& poser, AnimationClipCPtr& clip, const AtomsCore::Skeleton& skeleton, AtomsCore::Pose& pose, const AtomsCore::Vector3& velocity, const unsigned int frame, const unsigned int nextFrame, const double reminder, const int rootPelvisIndex);
53 
54  void removeFootLock(const AtomsCore::Skeleton& skeleton, AtomsCore::Pose& pose);
55  void scaleMetadata(const AtomsCore::Skeleton& skeleton, AtomsCore::Pose& pose, double agentScale, double retargetingFactor);
56  void scaleDetachedJoints(const AtomsCore::Skeleton& skeleton, AtomsCore::Pose& pose, double agentScale, double retargetingFactor);
57  void setLocalDirectionAndVelocity(AtomsCore::Poser& poser,
58  AnimationClipCPtr& clip,
59  const AtomsCore::Skeleton& skeleton,
60  AtomsCore::Pose& pose,
61  const AtomsCore::Vector3& velocity,
62  double retargetingFactor,
63  bool syncede,
64  const AtomsCore::Vector3 &rootOffset,
65  double clipFrame,
66  double startTime,
67  double endTime);
68 
69 
72  bool useBind,
73  const AtomsCore::JointChain* chain,
74  const std::vector<AtomsCore::Vector3>& allPositions,
75  const AtomsCore::Vector3 &startPos,
76  const AtomsCore::Vector3 &endPos,
77  AtomsCore::Vector3 &midPos,
78  AtomsCore::Vector3 &poleVector,
79  double threshold = 0.9999);
80 
81  AtomsCore::Vector3 getTargetPoint(
82  const AtomsCore::Vector3 sStartPos,
83  const AtomsCore::Vector3 sEndPos,
84  const AtomsCore::Vector3 tStartPos,
85  const AtomsCore::Vector3 offset,
86  double factor);
87 
88  void resetJointPoses(const AtomsCore::Skeleton& skeleton, AtomsCore::Pose& pose);
89 
90  void refreshTargetMatrix(
91  const AtomsCore::Skeleton& tSkeleton,
92  AtomsCore::Pose& tPose,
93  unsigned short jointId);
94 
95  void computeRetarget(
96  const Atoms::AgentTypeCPtr tAgentType,
97  const Atoms::AgentTypeCPtr sAgentType,
98  const AtomsCore::Skeleton& tSkeleton,
99  const AtomsCore::Skeleton& sSkeleton,
100  AtomsCore::Pose& tPose,
101  AtomsCore::Pose& sPose,
102  std::map<unsigned short, AtomsCore::MapMetadata> &sMetadata,
103  const double agentScale);
104 
105  inline void useLocomotion(bool value) { m_isLocomotion = value; }
106 
107  void setTimeAndPreviousTime(double time, double prevTime);
108 
109  private:
110 
111  double getIkBlend(
112  const AtomsCore::JointChain* sChain,
113  std::map<unsigned short, AtomsCore::MapMetadata>& sMetadata
114  );
115 
116  AtomsMath::Vector3 computeIkBlendRelativeTarget(
117  const AtomsCore::JointChain* tChain,
118  const AtomsCore::JointChain* sChain,
119  const double agentScale,
120  const AtomsMath::Vector3& agentPlaneNormal
121  );
122 
123  AtomsMath::Vector3 computeIkBlendRelativeTarget(
125  const Atoms::AgentTypeCPtr tAgentType,
126  const Atoms::AgentTypeCPtr sAgentType,
127  AtomsCore::Pose& tPose,
128  const AtomsMath::Vector3& agentPlaneNormal,
129  const AtomsCore::Vector3& sStartPos,
130  const AtomsCore::Vector3& sEndPos,
131  const AtomsCore::Vector3& tStartPos,
132  const double agentScale
133  );
134 
135  AtomsMath::Vector3 computeTargetPos(
136  std::map<unsigned short, AtomsCore::MapMetadata>& sMetadata,
138  const Atoms::AgentTypeCPtr tAgentType,
139  const Atoms::AgentTypeCPtr sAgentType,
140  AtomsCore::Pose& tPose,
141  const AtomsMath::Vector3& agentPlaneNormal,
142  const AtomsCore::Vector3& sStartPos,
143  const AtomsCore::Vector3& sEndPos,
144  const AtomsCore::Vector3& tStartPos,
145  const double agentScale);
146 
147  void computeThreeJointChain(
149  const Atoms::AgentTypeCPtr tAgentType,
150  const Atoms::AgentTypeCPtr sAgentType,
151  AtomsCore::Pose& tPose,
152  const AtomsMath::Vector3& targetPos,
153  const AtomsCore::Vector3& sStartPos,
154  const AtomsCore::Vector3& sEndPos,
155  const AtomsCore::Vector3& tStartPos,
156  const double agentScale,
157  const std::pair<AtomsMath::Vector3, AtomsMath::Vector3>& localPoleVector);
158 
159  void computeFARBIKChain(
161  const Atoms::AgentTypeCPtr tAgentType,
162  const Atoms::AgentTypeCPtr sAgentType,
163  AtomsCore::Pose& tPose,
164  const AtomsMath::Vector3& targetPos,
165  const AtomsCore::Vector3& sStartPos,
166  const AtomsCore::Vector3& sEndPos,
167  const AtomsCore::Vector3& tStartPos);
168 
169  AtomsCore::Matrix getClipJointMatrix(AnimationClipCPtr& clip,
170  const AtomsCore::Skeleton& skeleton,
171  int clampedFrame, double weight,
172  AtomsCore::JointCPtr pelvisJoint);
173 
174  private:
175 
176  AtomsCore::Vector3 m_prevDirection;
177 
178  AtomsGraph::StringPort* m_clipNamePort;
179 
180  AtomsGraph::DoublePort* m_timePort;
181 
182  AtomsGraph::DoublePort* m_startFramePort;
183 
184  AtomsGraph::DoublePort* m_endFramePort;
185 
186  AtomsGraph::DoublePort* m_frameRate;
187 
188  AtomsGraph::DoublePort* m_outframePort;
189 
190  AtomsGraph::BooleanPort* m_overrideSimDirectionPort;
191 
192  AtomsGraph::BooleanPort* m_disableDirectionBlendingPort;
193 
194  AtomsGraph::DoublePort* m_overrideSimDirectionMaxTurnAnglePort;
195 
196  Atoms::AnimationClipLooper *m_clipLooper;
197 
198  unsigned int m_currentLoop;
199 
200  std::vector<int> m_skeletonClipJointId;
201 
202  std::vector<BindData> m_bindData;
203 
204  std::string frameRateOverrideName;
205 
206  AnimationClipCPtr m_clip;
207 
208  double m_retargetingFactor;
209 
211  Atoms::AgentTypeCPtr m_agentTypeCPtr;
212 
214  AtomsCore::Pose m_sourcePose;
215 
217  std::map<std::string, AtomsCore::Vector3> m_poleVectorInBindMap;
218 
220  std::vector<AtomsCore::Matrix> m_sAllMatrix;
221  std::vector<AtomsCore::Matrix> m_tAllMatrix;
222  std::vector<AtomsCore::Vector3> m_sAllPositions;
223  std::vector<AtomsCore::Vector3> m_tAllPositions;
224  std::vector<bool> m_tAllMatrixDirty;
225  std::vector<std::pair<AtomsMath::Vector3, AtomsMath::Vector3>> m_localPoleVectors;
226  AtomsCore::Quaternion rotationOffset;
227 
228  double m_prevTime;
229 
230  double m_agentTypeScaleMultiplier;
231 
232  bool m_isAtomsClip;
233  bool m_isLoop;
234  bool m_first;
235  bool m_retarget;
236  bool m_isParentSpace;
237  bool m_isLocomotion;
238  bool m_loopBlending;
239  };
240 }
AtomsCore::Quaternion
AtomsMath::Quaternion Quaternion
Quaternion class.
Definition: AtomsMath.h:67
Atoms::ClipReaderOperator::getPoleVector
bool getPoleVector(bool useBind, const AtomsCore::JointChain *chain, const std::vector< AtomsCore::Vector3 > &allPositions, const AtomsCore::Vector3 &startPos, const AtomsCore::Vector3 &endPos, AtomsCore::Vector3 &midPos, AtomsCore::Vector3 &poleVector, double threshold=0.9999)
Methods to compute retargeting.
AtomsCore::SkeletonLod
Definition: Skeleton.h:25
AtomsCore::Matrix
AtomsMath::Matrix Matrix
Matrix class.
Definition: AtomsMath.h:63
AtomsCore::Vector3
AtomsMath::Vector3 Vector3
Vector3 class.
Definition: AtomsMath.h:57
Atoms::ClipReaderOperator::reset
void reset()
Operator reset function.
AtomsCore::Poser
Poser class.
Definition: Poser.h:24
AtomsCore::JointChain
JointChain class.
Definition: JointChain.h:31
AtomsGraph::PortTemplate
Generic node port class.
Definition: PortTemplate.h:24
Atoms::AnimationClipCPtr
AtomsPtr< const AnimationClip > AnimationClipCPtr
animation clip const pointer
Definition: AnimationClip.h:31
AtomsCore::Joint
Joint class.
Definition: Joint.h:30
Atoms
Atoms namespace.
Definition: Agent.h:28
Atoms::ClipReaderOperator::compute
bool compute(const AtomsGraph::ComputeData *computeData)
Compute function.
AtomsCore::Pose
Pose class.
Definition: Pose.h:32
Atoms::Operator
Operator node.
Definition: Operator.h:26
AtomsCore::Skeleton
Skeleton class.
Definition: Skeleton.h:68
Atoms::AgentType::RetargetJointChainData
Definition: AgentType.h:41
AtomsGraph::ComputeData
Definition: Node.h:21
Atoms::AgentTypeCPtr
AtomsPtr< const AgentType > AgentTypeCPtr
Agent type const pointer.
Definition: AgentType.h:21
Atoms::AnimationClipLooper
Animation clip looper.
Definition: AnimationClipLooper.h:27
Atoms::ClipReaderOperator
Definition: ClipReaderOperator.h:22
Atoms::ClipReaderOperator::BindData
Definition: ClipReaderOperator.h:26