Atoms Crowd  4.1.0
PelvisOperator.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/HeightFields.h>
15 #include <AtomsUtils/Mesh.h>
16 
17 namespace Atoms
18 {
19  class ATOMS_EXPORT PelvisOperator : public Operator
20  {
21  public:
22 
23  NODE_STANDARD_MEMBERS
24 
26 
27  virtual ~PelvisOperator();
28 
29  bool compute(const AtomsGraph::ComputeData* computeData);
30 
31  void reset();
32 
33  void computePelvisAndFeetHeightField(
34  AtomsCore::Vector3& jointRootWorldTranlsate,
35  AtomsCore::Quaternion& jointRootWorldRotate,
36  AtomsCore::Vector3& jointRootWorldScale,
37  const std::string& hf,
38  const std::string& gf,
39  HeightFields* hfManager,
40  const AtomsCore::Skeleton& skeleton,
41  AtomsCore::Vector3& upDirVec,
42  AtomsCore::Quaternion& initialRootRotation,
43  double heightFieldOffset,
44  bool compensateStretchLeg,
45  bool useHeightFieldOnCreationOnly);
46 
47  void computePelvisAndFeetHeightFieldInParentSpace(
48  AtomsCore::Vector3& jointRootWorldTranlsate,
49  AtomsCore::Quaternion& jointRootWorldRotate,
50  AtomsCore::Vector3& jointRootWorldScale,
51  const std::string& hf,
52  const std::string& gf,
53  HeightFields* hfManager,
54  const AtomsCore::Skeleton& skeleton,
55  AtomsCore::Vector3& upDirVec,
56  AtomsCore::Quaternion& initialRootRotation,
57  double heightFieldOffset,
58  bool compensateStretchLeg,
59  bool useHeightFieldOnCreationOnly);
60 
61  void computeSpinesHeightfields(
62  const std::string& hf,
63  const std::string& gf,
64  HeightFields* hfManager,
65  const AtomsCore::Skeleton& skeleton,
66  AtomsCore::Vector3& upDirVec,
67  double heightFieldOffset,
68  bool useHeightFieldOnCreationOnly);
69 
70  void computeSpinesHeightfieldsInParentSpace(
71  const std::string& hf,
72  const std::string& gf,
73  HeightFields* hfManager,
74  const AtomsCore::Skeleton& skeleton,
75  AtomsCore::Vector3& upDirVec,
76  double heightFieldOffset,
77  bool useHeightFieldOnCreationOnly);
78 
79  void compensateLegStretch(
80  AtomsCore::Vector3& jointRootWorldTranlsate,
81  AtomsCore::Quaternion& jointRootWorldRotate,
82  AtomsCore::Vector3& jointRootWorldScale,
83  const AtomsCore::Skeleton& skeleton,
84  AtomsCore::JointPose &rootPose,
85  Atoms::HeightField* hfMesh,
86  AtomsCore::Vector3& upDirVec,
87  double heightFieldOffset);
88 
89  void compensateLegStretchInParentSpace(
90  AtomsCore::Vector3& jointRootWorldTranlsate,
91  AtomsCore::Quaternion& jointRootWorldRotate,
92  AtomsCore::Vector3& jointRootWorldScale,
93  const AtomsCore::Skeleton& skeleton,
94  AtomsCore::JointPose &rootPose,
95  Atoms::HeightField* hfMesh,
96  AtomsCore::Vector3& upDirVec,
97  double heightFieldOffset);
98 
99  inline void useLocomotion(bool value) { m_isLocomotion = value; }
100 
101  private:
102  AtomsGraph::PosePort* m_inPose;
103  AtomsGraph::BooleanPort* m_useDirectionFromMetadataPort;
104  AtomsGraph::BooleanPort* m_useOnlyPositionPort;
105  AtomsGraph::BooleanPort* m_raycastGravityFieldPort;
106  AtomsGraph::VectorPort* m_directionPort;
107  AtomsGraph::DoublePort* m_heightFieldOffsetPort;
108  AtomsGraph::StringPort* m_heightFieldPort;
109  AtomsGraph::StringPort* m_gravityFieldPort;
110  AtomsGraph::BooleanPort* m_useHeightFieldOnCreationOnly;
111  AtomsGraph::DoublePort* m_particleAlignUpAxisTresholdAngle;
112  AtomsGraph::DoublePort* m_upVectorMaxAngle;
113  AtomsGraph::DoublePort* m_softIkDistance;
114  AtomsGraph::BooleanPort* m_sitAdaptationPort;
115  //AtomsGraph::BooleanPort* m_useHFAsGravityPort;
116 
117  AtomsGraph::BooleanPort* m_compensateLegStretchPort;
118 
119  AtomsCore::Vector3 m_pelvisCacheTranslation;
120  AtomsCore::Vector3 m_pelvisCacheVelocity;
121  AtomsCore::Quaternion m_pelvisCacheRotation;
122 
123  AtomsCore::Quaternion m_particleCacheRotation;
124  AtomsCore::Vector3 m_particleCacheUpVector;
125  AtomsCore::Vector3 m_particleCacheUnmodUpVector;
126  AtomsCore::Vector3 m_particleCacheDirectionVector;
127  AtomsCore::Vector3 m_particleCacheTranslation;
128  AtomsCore::Vector3 m_particleCacheVelocity;
129  AtomsCore::Vector3 m_previousParticleDirection;
130 
131  AtomsCore::Quaternion m_upDirRotation;
132 
133  double m_groudHeight;
134 
135  AtomsCore::Vector3 m_prevHfOffsetVariation;
136  AtomsCore::Vector3 m_previousDirection;
137 
138  AtomsCore::Vector3 m_staticGroundOffset;
139 
140  std::vector<unsigned int> m_footFrameAfterDown;
141  std::vector<unsigned int> m_footWasDown;
142  std::vector<AtomsCore::Matrix> m_detachedJointMatrices;
143 
144  AtomsPtr<AtomsCore::MapMetadata> m_hfAnimatedMetaMap;
145 
146  AtomsCore::Matrix m_animRootMtx;
147  AtomsCore::Vector3 m_animLocalVelocity;
148  AtomsCore::Vector3 m_animLocalUpVector;
149  AtomsCore::Vector3 m_animPrevUpVector;
150  AtomsCore::Matrix m_oldAnimFaceMtx;
151  double m_agentTypeHeight;
152  double m_animPointU;
153  double m_animPointV;
154  int m_animPointFaceId;
155 
156  bool m_particleFirst;
157  bool m_pelvisFirst;
158  bool m_first;
159  bool m_hasCacheReader;
160  bool m_isLocomotion;
161 
162  public:
163 
164  static const std::string maxTurnAngleKey;
165  static const std::string ikSolverKey;
166  static const std::string ikTolleranceKey;
167  static const std::string ikMaxIterationsKey;
168 
169  static const std::string pelvisBehave3dCacheDirKey;
170  static const std::string pelvisBehave3dCacheUpKey;
171  };
172 }
AtomsCore::Quaternion
AtomsMath::Quaternion Quaternion
Quaternion class.
Definition: AtomsMath.h:67
Atoms::HeightFields
Container for all agent types.
Definition: HeightFields.h:19
Atoms::PelvisOperator
Definition: PelvisOperator.h:20
Atoms::PelvisOperator::compute
bool compute(const AtomsGraph::ComputeData *computeData)
Compute function.
AtomsCore::Matrix
AtomsMath::Matrix Matrix
Matrix class.
Definition: AtomsMath.h:63
AtomsCore::Vector3
AtomsMath::Vector3 Vector3
Vector3 class.
Definition: AtomsMath.h:57
AtomsGraph::PortTemplate
Generic node port class.
Definition: PortTemplate.h:24
Atoms::PelvisOperator::reset
void reset()
Operator reset function.
AtomsCore::JointPose
Joint pose.
Definition: JointPose.h:20
Atoms
Atoms namespace.
Definition: Agent.h:28
Atoms::Operator
Operator node.
Definition: Operator.h:26
AtomsCore::Skeleton
Skeleton class.
Definition: Skeleton.h:68
AtomsGraph::ComputeData
Definition: Node.h:21
Atoms::HeightField
Container for all agent types.
Definition: HeightField.h:17