From 46d9a14951f8452897477a6d47bfd34618eaddbe Mon Sep 17 00:00:00 2001 From: samcake Date: Fri, 6 Nov 2015 09:35:20 -0800 Subject: [PATCH] Work in progress, fixing the animation playback --- interface/src/avatar/Avatar.cpp | 11 +++++++++++ interface/src/avatar/Avatar.h | 1 + libraries/avatars/src/AvatarData.cpp | 15 +++++++++++++++ libraries/avatars/src/AvatarData.h | 1 + libraries/avatars/src/Player.cpp | 11 ++++++----- libraries/avatars/src/Recorder.cpp | 2 ++ 6 files changed, 36 insertions(+), 5 deletions(-) diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index b979334383..a5ae8cddda 100644 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -888,6 +888,17 @@ glm::quat Avatar::getJointRotation(int index) const { return rotation; } +QVector Avatar::getJointTranslations() const { + if (QThread::currentThread() != thread()) { + return AvatarData::getJointTranslations(); + } + QVector jointTranslations(_skeletonModel.getJointStateCount()); + for (int i = 0; i < _skeletonModel.getJointStateCount(); ++i) { + _skeletonModel.getJointTranslation(i, jointTranslations[i]); + } + return jointTranslations; +} + glm::vec3 Avatar::getJointTranslation(int index) const { if (QThread::currentThread() != thread()) { return AvatarData::getJointTranslation(index); diff --git a/interface/src/avatar/Avatar.h b/interface/src/avatar/Avatar.h index 44b5d91015..cb7c533db6 100644 --- a/interface/src/avatar/Avatar.h +++ b/interface/src/avatar/Avatar.h @@ -103,6 +103,7 @@ public: virtual QVector getJointRotations() const; virtual glm::quat getJointRotation(int index) const; + virtual QVector getJointTranslations() const; virtual glm::vec3 getJointTranslation(int index) const; virtual int getJointIndex(const QString& name) const; virtual QStringList getJointNames() const; diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index a698c6f374..a13c01901e 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -1146,6 +1146,21 @@ void AvatarData::setJointRotations(QVector jointRotations) { } } +QVector AvatarData::getJointTranslations() const { + if (QThread::currentThread() != thread()) { + QVector result; + QMetaObject::invokeMethod(const_cast(this), + "getJointTranslations", Qt::BlockingQueuedConnection, + Q_RETURN_ARG(QVector, result)); + return result; + } + QVector jointTranslations(_jointData.size()); + for (int i = 0; i < _jointData.size(); ++i) { + jointTranslations[i] = _jointData[i].translation; + } + return jointTranslations; +} + void AvatarData::setJointTranslations(QVector jointTranslations) { if (QThread::currentThread() != thread()) { QVector result; diff --git a/libraries/avatars/src/AvatarData.h b/libraries/avatars/src/AvatarData.h index 3abd63bf63..da857f2f8a 100644 --- a/libraries/avatars/src/AvatarData.h +++ b/libraries/avatars/src/AvatarData.h @@ -260,6 +260,7 @@ public: Q_INVOKABLE virtual QVector getJointRotations() const; Q_INVOKABLE virtual void setJointRotations(QVector jointRotations); + Q_INVOKABLE virtual QVector getJointTranslations() const; Q_INVOKABLE virtual void setJointTranslations(QVector jointTranslations); Q_INVOKABLE virtual void clearJointsData(); diff --git a/libraries/avatars/src/Player.cpp b/libraries/avatars/src/Player.cpp index a425323a41..bb98f51139 100644 --- a/libraries/avatars/src/Player.cpp +++ b/libraries/avatars/src/Player.cpp @@ -247,19 +247,20 @@ void Player::play() { _frameInterpolationFactor); _avatar->setTargetScale(context->scale * scale); - + float animFactor = 0.0f; + QVector jointRotations(currentFrame.getJointRotations().size()); for (int i = 0; i < currentFrame.getJointRotations().size(); ++i) { jointRotations[i] = safeMix(currentFrame.getJointRotations()[i], nextFrame.getJointRotations()[i], - _frameInterpolationFactor); + animFactor); } QVector jointTranslations(currentFrame.getJointTranslations().size()); for (int i = 0; i < currentFrame.getJointTranslations().size(); ++i) { - jointTranslations[i] = - currentFrame.getJointTranslations()[i] * (1.0f - _frameInterpolationFactor) + - nextFrame.getJointTranslations()[i] * _frameInterpolationFactor; + jointTranslations[i] = glm::mix(currentFrame.getJointTranslations()[i], + nextFrame.getJointTranslations()[i], + animFactor); } _avatar->setJointRotations(jointRotations); diff --git a/libraries/avatars/src/Recorder.cpp b/libraries/avatars/src/Recorder.cpp index 8a90500f00..eeaa8cb1fd 100644 --- a/libraries/avatars/src/Recorder.cpp +++ b/libraries/avatars/src/Recorder.cpp @@ -101,6 +101,7 @@ void Recorder::record() { RecordingFrame frame; frame.setBlendshapeCoefficients(_avatar->getHeadData()->getBlendshapeCoefficients()); frame.setJointRotations(_avatar->getJointRotations()); + frame.setJointTranslations(_avatar->getJointTranslations()); frame.setTranslation(context.orientationInv * (_avatar->getPosition() - context.position)); frame.setRotation(context.orientationInv * _avatar->getOrientation()); frame.setScale(_avatar->getTargetScale() / context.scale); @@ -124,6 +125,7 @@ void Recorder::record() { qCDebug(avatars) << "Recording frame #" << _recording->getFrameNumber(); qCDebug(avatars) << "Blendshapes:" << frame.getBlendshapeCoefficients().size(); qCDebug(avatars) << "JointRotations:" << frame.getJointRotations().size(); + qCDebug(avatars) << "JointRotations:" << frame.getJointTranslations().size(); qCDebug(avatars) << "Translation:" << frame.getTranslation(); qCDebug(avatars) << "Rotation:" << frame.getRotation(); qCDebug(avatars) << "Scale:" << frame.getScale();