From 0e1e5db7eb808a71f209e7c219e74a87b29ddf58 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Tue, 15 Dec 2015 16:29:39 -0800 Subject: [PATCH] only need one animateScaleChanges() implementation --- interface/src/avatar/Avatar.cpp | 13 ++++++++----- interface/src/avatar/MyAvatar.cpp | 16 ---------------- interface/src/avatar/MyAvatar.h | 3 --- 3 files changed, 8 insertions(+), 24 deletions(-) diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index 504124c4a7..f8040754d7 100644 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -150,14 +150,17 @@ float Avatar::getLODDistance() const { void Avatar::animateScaleChanges(float deltaTime) { float currentScale = getUniformScale(); if (currentScale != _targetScale) { + // use exponential decay toward _targetScale const float SCALE_ANIMATION_TIMESCALE = 0.5f; - float scaleVelocity = (_targetScale - currentScale) / SCALE_ANIMATION_TIMESCALE; - float animatedScale = currentScale + deltaTime * scaleVelocity; - const float MIN_SCALE_SPEED = 0.3f; - if (fabsf(scaleVelocity) < MIN_SCALE_SPEED) { - // close enough + float blendFactor = glm::clamp(deltaTime / SCALE_ANIMATION_TIMESCALE, 0.0f, 1.0f); + float animatedScale = (1.0f - blendFactor) * currentScale + blendFactor * _targetScale; + + // snap to the end when we get close enough + const float MIN_RELATIVE_SCALE_ERROR = 0.03f; + if (fabsf(_targetScale - currentScale) / _targetScale < 0.03f) { animatedScale = _targetScale; } + setScale(glm::vec3(animatedScale)); // avatar scale is uniform rebuildCollisionShape(); } diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 73ff332a37..5c8230bd88 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -284,22 +284,6 @@ void MyAvatar::update(float deltaTime) { extern QByteArray avatarStateToFrame(const AvatarData* _avatar); extern void avatarStateFromFrame(const QByteArray& frameData, AvatarData* _avatar); -void MyAvatar::animateScaleChanges(float deltaTime) { - // HACK: override Avatar::animateScaleChanges() until MyAvatar has a MotionState - float currentScale = getUniformScale(); - if (currentScale != _targetScale) { - const float SCALE_ANIMATION_TIMESCALE = 1.0f; - float blendFactor = deltaTime / SCALE_ANIMATION_TIMESCALE; - float animatedScale = (1.0f - blendFactor) * currentScale + blendFactor * _targetScale; - const float CLOSE_ENOUGH = 0.05f; - if (fabsf(animatedScale - _targetScale) / _targetScale < CLOSE_ENOUGH) { - animatedScale = _targetScale; - } - setScale(glm::vec3(animatedScale)); - rebuildCollisionShape(); - } -} - void MyAvatar::simulate(float deltaTime) { PerformanceTimer perfTimer("simulate"); diff --git a/interface/src/avatar/MyAvatar.h b/interface/src/avatar/MyAvatar.h index bce6521c07..019ba0f992 100644 --- a/interface/src/avatar/MyAvatar.h +++ b/interface/src/avatar/MyAvatar.h @@ -263,9 +263,6 @@ public slots: glm::vec3 getPositionForAudio(); glm::quat getOrientationForAudio(); -protected: - void animateScaleChanges(float deltaTime); - signals: void audioListenerModeChanged(); void transformChanged();