From 15025bf8d87c10c3cce8e2558b027aa5096cb61f Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Mon, 8 Sep 2014 13:08:08 -0700 Subject: [PATCH] fix for flickering avatars --- interface/src/avatar/Avatar.cpp | 20 ++++---------------- interface/src/avatar/Avatar.h | 3 --- interface/src/avatar/MyAvatar.cpp | 15 ++++++++++++--- interface/src/avatar/MyAvatar.h | 1 + libraries/avatars/src/AvatarData.cpp | 5 +++-- 5 files changed, 20 insertions(+), 24 deletions(-) diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index b5b238b9d7..ca32adb6ba 100644 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -50,7 +50,7 @@ Avatar::Avatar() : AvatarData(), _skeletonModel(this), _bodyYawDelta(0.0f), - _lastPosition(0.0f), + _lastPosition(_position), _velocity(0.0f), _lastVelocity(0.0f), _acceleration(0.0f), @@ -204,7 +204,9 @@ void Avatar::simulate(float deltaTime) { _displayNameAlpha = abs(_displayNameAlpha - _displayNameTargetAlpha) < 0.01f ? _displayNameTargetAlpha : _displayNameAlpha; } - _position += _velocity * deltaTime; + // NOTE: we shouldn't extrapolate an Avatar instance forward in time... + // until velocity is in AvatarData update message. + //_position += _velocity * deltaTime; measureMotionDerivatives(deltaTime); } @@ -223,20 +225,6 @@ void Avatar::measureMotionDerivatives(float deltaTime) { _lastOrientation = getOrientation(); } -void Avatar::setPosition(const glm::vec3 position, bool overideReferential) { - AvatarData::setPosition(position, overideReferential); - _lastPosition = position; - _velocity = glm::vec3(0.0f); - _lastVelocity = glm::vec3(0.0f); -} - -void Avatar::slamPosition(const glm::vec3& newPosition) { - _position = newPosition; - _lastPosition = newPosition; - _velocity = glm::vec3(0.0f); - _lastVelocity = glm::vec3(0.0f); -} - void Avatar::setMouseRay(const glm::vec3 &origin, const glm::vec3 &direction) { _mouseRayOrigin = origin; _mouseRayDirection = direction; diff --git a/interface/src/avatar/Avatar.h b/interface/src/avatar/Avatar.h index 43b5150a48..b055e83491 100755 --- a/interface/src/avatar/Avatar.h +++ b/interface/src/avatar/Avatar.h @@ -161,9 +161,6 @@ public: /// \param vector position to be scaled. Will store the result void scaleVectorRelativeToPosition(glm::vec3 &positionToScale) const; - void setPosition(const glm::vec3 position, bool overideReferential = false); - void slamPosition(const glm::vec3& newPosition); - public slots: void updateCollisionGroups(); diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 4b0e4eef5a..6472ba2efa 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -609,6 +609,13 @@ void MyAvatar::setGravity(const glm::vec3& gravity) { // so it continues to point opposite to the previous gravity setting. } +void MyAvatar::slamPosition(const glm::vec3& newPosition) { + AvatarData::setPosition(newPosition); + _lastPosition = _position; + _velocity = glm::vec3(0.0f); + _lastVelocity = glm::vec3(0.0f); +} + AnimationHandlePointer MyAvatar::addAnimationHandle() { AnimationHandlePointer handle = _skeletonModel.createAnimationHandle(); _animationHandles.append(handle); @@ -797,9 +804,11 @@ void MyAvatar::loadData(QSettings* settings) { getHead()->setBasePitch(loadSetting(settings, "headPitch", 0.0f)); - _position.x = loadSetting(settings, "position_x", START_LOCATION.x); - _position.y = loadSetting(settings, "position_y", START_LOCATION.y); - _position.z = loadSetting(settings, "position_z", START_LOCATION.z); + glm::vec3 newPosition; + newPosition.x = loadSetting(settings, "position_x", START_LOCATION.x); + newPosition.y = loadSetting(settings, "position_y", START_LOCATION.y); + newPosition.z = loadSetting(settings, "position_z", START_LOCATION.z); + slamPosition(newPosition); getHead()->setPupilDilation(loadSetting(settings, "pupilDilation", 0.0f)); diff --git a/interface/src/avatar/MyAvatar.h b/interface/src/avatar/MyAvatar.h index d7b955ce06..be828e0c91 100644 --- a/interface/src/avatar/MyAvatar.h +++ b/interface/src/avatar/MyAvatar.h @@ -57,6 +57,7 @@ public: void setLeanScale(float scale) { _leanScale = scale; } void setLocalGravity(glm::vec3 gravity); void setShouldRenderLocally(bool shouldRender) { _shouldRender = shouldRender; } + void slamPosition(const glm::vec3& position); // getters float getLeanScale() const { return _leanScale; } diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index 264d8ac580..200a6af6c7 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -35,7 +35,8 @@ using namespace std; AvatarData::AvatarData() : _sessionUUID(), - _handPosition(0,0,0), + _position(0.0f), + _handPosition(0.0f), _referential(NULL), _bodyYaw(-90.f), _bodyPitch(0.0f), @@ -326,7 +327,7 @@ int AvatarData::parseDataAtOffset(const QByteArray& packet, int offset) { } return maxAvailableSize; } - _position = position; + setPosition(position); // rotation (NOTE: This needs to become a quaternion to save two bytes) float yaw, pitch, roll;