11 #ifndef hifi_AnimUtil_h
12 #define hifi_AnimUtil_h
17 void blend(
size_t numPoses,
const AnimPose* a,
const AnimPose* b,
float alpha, AnimPose* result);
20 void blend3(
size_t numPoses,
const AnimPose* a,
const AnimPose* b,
const AnimPose* c,
float* alphas, AnimPose* result);
23 void blend4(
size_t numPoses,
const AnimPose* a,
const AnimPose* b,
const AnimPose* c,
const AnimPose* d,
float* alphas, AnimPose* result);
26 void blendAdd(
size_t numPoses,
const AnimPose* a,
const AnimPose* b,
float alpha, AnimPose* result);
28 glm::quat averageQuats(
size_t numQuats,
const glm::quat* quats);
30 float accumulateTime(
float startFrame,
float endFrame,
float timeScale,
float currentFrame,
float dt,
bool loopFlag,
31 const QString&
id, AnimVariantMap& triggersOut);
33 inline glm::quat safeLerp(
const glm::quat& a,
const glm::quat& b,
float alpha) {
36 float dot = glm::dot(a, bTemp);
40 return glm::normalize(glm::lerp(a, bTemp, alpha));
43 inline glm::quat safeLinearCombine3(
const glm::quat& a,
const glm::quat& b,
const glm::quat& c,
float* alphas) {
46 float dot = glm::dot(a, bTemp);
51 dot = glm::dot(a, cTemp);
55 return glm::normalize(alphas[0] * a + alphas[1] * bTemp + alphas[2] * cTemp);
58 inline glm::quat safeLinearCombine4(
const glm::quat& a,
const glm::quat& b,
const glm::quat& c,
const glm::quat& d,
float* alphas) {
61 float dot = glm::dot(a, bTemp);
66 dot = glm::dot(a, cTemp);
71 dot = glm::dot(a, dTemp);
75 return glm::normalize(alphas[0] * a + alphas[1] * bTemp + alphas[2] * cTemp + alphas[3] * dTemp);
78 AnimPose boneLookAt(
const glm::vec3& target,
const AnimPose& bone);
83 glm::quat computeBodyFacingFromHead(
const glm::quat& headRot,
const glm::vec3& up);
89 class CriticallyDampedSpringPoseHelper {
91 CriticallyDampedSpringPoseHelper() : _prevPoseValid(false) {}
93 void setHorizontalTranslationTimescale(
float timescale) {
94 _horizontalTranslationTimescale = timescale;
96 void setVerticalTranslationTimescale(
float timescale) {
97 _verticalTranslationTimescale = timescale;
99 void setRotationTimescale(
float timescale) {
100 _rotationTimescale = timescale;
103 AnimPose update(
const AnimPose& pose,
float deltaTime) {
104 if (!_prevPoseValid) {
106 _prevPoseValid =
true;
109 const float horizontalTranslationAlpha = glm::min(deltaTime / _horizontalTranslationTimescale, 1.0f);
110 const float verticalTranslationAlpha = glm::min(deltaTime / _verticalTranslationTimescale, 1.0f);
111 const float rotationAlpha = glm::min(deltaTime / _rotationTimescale, 1.0f);
113 const float poseY = pose.trans().y;
114 AnimPose newPose = _prevPose;
115 newPose.trans() = lerp(_prevPose.trans(), pose.trans(), horizontalTranslationAlpha);
116 newPose.trans().y = lerp(_prevPose.trans().y, poseY, verticalTranslationAlpha);
117 newPose.rot() = safeLerp(_prevPose.rot(), pose.rot(), rotationAlpha);
120 _prevPoseValid =
true;
125 void teleport(
const AnimPose& pose) {
126 _prevPoseValid =
true;
132 float _horizontalTranslationTimescale { 0.15f };
133 float _verticalTranslationTimescale { 0.15f };
134 float _rotationTimescale { 0.15f };
138 class SnapshotBlendPoseHelper {
140 SnapshotBlendPoseHelper() : _snapshotValid(false) {}
142 void setBlendDuration(
float duration) {
143 _duration = duration;
146 void setSnapshot(
const AnimPose& pose) {
147 _snapshotValid =
true;
148 _snapshotPose = pose;
152 AnimPose update(
const AnimPose& targetPose,
float deltaTime) {
155 float alpha = (_duration - _timer) / _duration;
158 alpha = 1.0f - powf(2.0f, -10.0f * alpha);
160 AnimPose newPose = targetPose;
161 newPose.blend(_snapshotPose, alpha);
169 AnimPose _snapshotPose;
170 float _duration { 1.0f };
171 float _timer { 0.0f };
172 bool _snapshotValid {
false };
178 bool findPointKDopDisplacement(
const glm::vec3& point,
const AnimPose& shapePose,
const HFMJointShapeInfo& shapeInfo, glm::vec3& displacementOut);
182 EasingType_EaseInSine,
183 EasingType_EaseOutSine,
184 EasingType_EaseInOutSine,
185 EasingType_EaseInQuad,
186 EasingType_EaseOutQuad,
187 EasingType_EaseInOutQuad,
188 EasingType_EaseInCubic,
189 EasingType_EaseOutCubic,
190 EasingType_EaseInOutCubic,
191 EasingType_EaseInQuart,
192 EasingType_EaseOutQuart,
193 EasingType_EaseInOutQuart,
194 EasingType_EaseInQuint,
195 EasingType_EaseOutQuint,
196 EasingType_EaseInOutQuint,
197 EasingType_EaseInExpo,
198 EasingType_EaseOutExpo,
199 EasingType_EaseInOutExpo,
200 EasingType_EaseInCirc,
201 EasingType_EaseOutCirc,
202 EasingType_EaseInOutCirc,
206 float easingFunc(
float alpha, EasingType type);