11 #ifndef hifi_AnimUtil_h
12 #define hifi_AnimUtil_h
19 void blend(
size_t numPoses,
const AnimPose* a,
const AnimPose* b,
float alpha, AnimPose* result);
22 void blend3(
size_t numPoses,
const AnimPose* a,
const AnimPose* b,
const AnimPose* c,
float* alphas, AnimPose* result);
25 void blend4(
size_t numPoses,
const AnimPose* a,
const AnimPose* b,
const AnimPose* c,
const AnimPose* d,
float* alphas, AnimPose* result);
28 void blendAdd(
size_t numPoses,
const AnimPose* a,
const AnimPose* b,
float alpha, AnimPose* result);
30 glm::quat averageQuats(
size_t numQuats,
const glm::quat* quats);
32 float accumulateTime(
float startFrame,
float endFrame,
float timeScale,
float currentFrame,
float dt,
bool loopFlag,
33 const QString&
id, AnimVariantMap& triggersOut);
35 inline glm::quat safeLerp(
const glm::quat& a,
const glm::quat& b,
float alpha) {
38 float dot = glm::dot(a, bTemp);
42 return glm::normalize(glm::lerp(a, bTemp, alpha));
45 inline glm::quat safeLinearCombine3(
const glm::quat& a,
const glm::quat& b,
const glm::quat& c,
float* alphas) {
48 float dot = glm::dot(a, bTemp);
53 dot = glm::dot(a, cTemp);
57 return glm::normalize(alphas[0] * a + alphas[1] * bTemp + alphas[2] * cTemp);
60 inline glm::quat safeLinearCombine4(
const glm::quat& a,
const glm::quat& b,
const glm::quat& c,
const glm::quat& d,
float* alphas) {
63 float dot = glm::dot(a, bTemp);
68 dot = glm::dot(a, cTemp);
73 dot = glm::dot(a, dTemp);
77 return glm::normalize(alphas[0] * a + alphas[1] * bTemp + alphas[2] * cTemp + alphas[3] * dTemp);
80 AnimPose boneLookAt(
const glm::vec3& target,
const AnimPose& bone);
85 glm::quat computeBodyFacingFromHead(
const glm::quat& headRot,
const glm::vec3& up);
91 class CriticallyDampedSpringPoseHelper {
93 CriticallyDampedSpringPoseHelper() : _prevPoseValid(false) {}
95 void setHorizontalTranslationTimescale(
float timescale) {
96 _horizontalTranslationTimescale = timescale;
98 void setVerticalTranslationTimescale(
float timescale) {
99 _verticalTranslationTimescale = timescale;
101 void setRotationTimescale(
float timescale) {
102 _rotationTimescale = timescale;
105 AnimPose update(
const AnimPose& pose,
float deltaTime) {
106 if (!_prevPoseValid) {
108 _prevPoseValid =
true;
111 const float horizontalTranslationAlpha = glm::min(deltaTime / _horizontalTranslationTimescale, 1.0f);
112 const float verticalTranslationAlpha = glm::min(deltaTime / _verticalTranslationTimescale, 1.0f);
113 const float rotationAlpha = glm::min(deltaTime / _rotationTimescale, 1.0f);
115 const float poseY = pose.trans().y;
116 AnimPose newPose = _prevPose;
117 newPose.trans() = lerp(_prevPose.trans(), pose.trans(), horizontalTranslationAlpha);
118 newPose.trans().y = std::lerp(_prevPose.trans().y, poseY, verticalTranslationAlpha);
119 newPose.rot() = safeLerp(_prevPose.rot(), pose.rot(), rotationAlpha);
122 _prevPoseValid =
true;
127 void teleport(
const AnimPose& pose) {
128 _prevPoseValid =
true;
134 float _horizontalTranslationTimescale { 0.15f };
135 float _verticalTranslationTimescale { 0.15f };
136 float _rotationTimescale { 0.15f };
140 class SnapshotBlendPoseHelper {
142 SnapshotBlendPoseHelper() : _snapshotValid(false) {}
144 void setBlendDuration(
float duration) {
145 _duration = duration;
148 void setSnapshot(
const AnimPose& pose) {
149 _snapshotValid =
true;
150 _snapshotPose = pose;
154 AnimPose update(
const AnimPose& targetPose,
float deltaTime) {
157 float alpha = (_duration - _timer) / _duration;
160 alpha = 1.0f - powf(2.0f, -10.0f * alpha);
162 AnimPose newPose = targetPose;
163 newPose.blend(_snapshotPose, alpha);
171 AnimPose _snapshotPose;
172 float _duration { 1.0f };
173 float _timer { 0.0f };
174 bool _snapshotValid {
false };
180 bool findPointKDopDisplacement(
const glm::vec3& point,
const AnimPose& shapePose,
const HFMJointShapeInfo& shapeInfo, glm::vec3& displacementOut);
184 EasingType_EaseInSine,
185 EasingType_EaseOutSine,
186 EasingType_EaseInOutSine,
187 EasingType_EaseInQuad,
188 EasingType_EaseOutQuad,
189 EasingType_EaseInOutQuad,
190 EasingType_EaseInCubic,
191 EasingType_EaseOutCubic,
192 EasingType_EaseInOutCubic,
193 EasingType_EaseInQuart,
194 EasingType_EaseOutQuart,
195 EasingType_EaseInOutQuart,
196 EasingType_EaseInQuint,
197 EasingType_EaseOutQuint,
198 EasingType_EaseInOutQuint,
199 EasingType_EaseInExpo,
200 EasingType_EaseOutExpo,
201 EasingType_EaseInOutExpo,
202 EasingType_EaseInCirc,
203 EasingType_EaseOutCirc,
204 EasingType_EaseInOutCirc,
208 float easingFunc(
float alpha, EasingType type);