From 41461cd322966842891caf21011a1a0f7a39ee3c Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Tue, 26 Aug 2014 17:23:50 -0700 Subject: [PATCH] Added option to playback from current location --- examples/Recorder.js | 2 +- libraries/avatars/src/AvatarData.cpp | 9 +++--- libraries/avatars/src/AvatarData.h | 2 +- libraries/avatars/src/Recorder.cpp | 46 +++++++++++++++++++--------- libraries/avatars/src/Recorder.h | 6 +++- 5 files changed, 43 insertions(+), 22 deletions(-) diff --git a/examples/Recorder.js b/examples/Recorder.js index 9a4375ab4f..0a42eff576 100644 --- a/examples/Recorder.js +++ b/examples/Recorder.js @@ -153,7 +153,7 @@ function mousePressEvent(event) { if (MyAvatar.isPlaying()) { MyAvatar.stopPlaying(); } else { - MyAvatar.startPlaying(); + MyAvatar.startPlaying(true); } } } else if (saveIcon === toolBar.clicked(clickedOverlay)) { diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index b3b8ba3ab1..e590a7b5ca 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -638,16 +638,17 @@ void AvatarData::loadRecording(QString filename) { _player->loadFromFile(filename); } -void AvatarData::startPlaying() { +void AvatarData::startPlaying(bool fromCurrentPosition) { if (QThread::currentThread() != thread()) { - QMetaObject::invokeMethod(this, "startPlaying", Qt::BlockingQueuedConnection); + QMetaObject::invokeMethod(this, "startPlaying", Qt::BlockingQueuedConnection, + Q_ARG(bool, fromCurrentPosition)); return; } if (!_player) { _player = PlayerPointer(new Player(this)); } - - _player->startPlaying(); + qDebug() << "AvatarData::startPlaying():" << fromCurrentPosition; + _player->startPlaying(fromCurrentPosition); } void AvatarData::play() { diff --git a/libraries/avatars/src/AvatarData.h b/libraries/avatars/src/AvatarData.h index 12fe3adb6e..26ce5b3b8b 100755 --- a/libraries/avatars/src/AvatarData.h +++ b/libraries/avatars/src/AvatarData.h @@ -303,7 +303,7 @@ public slots: qint64 playerElapsed(); qint64 playerLength(); void loadRecording(QString filename); - void startPlaying(); + void startPlaying(bool fromCurrentPosition = false); void play(); void stopPlaying(); diff --git a/libraries/avatars/src/Recorder.cpp b/libraries/avatars/src/Recorder.cpp index 5e9db60675..56ea39358e 100644 --- a/libraries/avatars/src/Recorder.cpp +++ b/libraries/avatars/src/Recorder.cpp @@ -165,7 +165,8 @@ void Recorder::record(char* samples, int size) { Player::Player(AvatarData* avatar) : _recording(new Recording()), _avatar(avatar), - _audioThread(NULL) + _audioThread(NULL), + _startingScale(1.0f) { _timer.invalidate(); _options.setLoop(false); @@ -215,7 +216,7 @@ float Player::getLeanForward() { return _recording->getFrame(_currentFrame).getLeanForward(); } -void Player::startPlaying() { +void Player::startPlaying(bool fromCurrentPosition) { if (_recording && _recording->getFrameNumber() > 0) { qDebug() << "Recorder::startPlaying()"; _currentFrame = 0; @@ -232,6 +233,16 @@ void Player::startPlaying() { // Fake faceshift connection _avatar->setForceFaceshiftConnected(true); + if (fromCurrentPosition) { + _startingPosition = _avatar->getPosition(); + _startingRotation = _avatar->getOrientation(); + _startingScale = _avatar->getTargetScale(); + } else { + _startingPosition = _recording->getFrame(0).getTranslation(); + _startingRotation = _recording->getFrame(0).getRotation(); + _startingScale = _recording->getFrame(0).getScale(); + } + _timer.start(); } } @@ -283,20 +294,25 @@ void Player::play() { return; } - if (_currentFrame == 0) { - _avatar->setPosition(_recording->getFrame(_currentFrame).getTranslation()); - _avatar->setOrientation(_recording->getFrame(_currentFrame).getRotation()); - _avatar->setTargetScale(_recording->getFrame(_currentFrame).getScale()); - _avatar->setJointRotations(_recording->getFrame(_currentFrame).getJointRotations()); - } else { - _avatar->setPosition(_recording->getFrame(0).getTranslation() + - _recording->getFrame(_currentFrame).getTranslation()); - _avatar->setOrientation(_recording->getFrame(0).getRotation() * - _recording->getFrame(_currentFrame).getRotation()); - _avatar->setTargetScale(_recording->getFrame(0).getScale() * - _recording->getFrame(_currentFrame).getScale()); - _avatar->setJointRotations(_recording->getFrame(_currentFrame).getJointRotations()); + glm::vec3 positionOffset; + glm::quat rotationOffset; + float scaleOffset = 1.0f; + + if (_currentFrame > 0) { + positionOffset = _startingPosition; + rotationOffset = _startingRotation; + scaleOffset = _startingScale; } + + _avatar->setPosition(positionOffset + + glm::inverse(_recording->getFrame(0).getRotation()) * rotationOffset * + _recording->getFrame(_currentFrame).getTranslation()); + _avatar->setOrientation(rotationOffset * + _recording->getFrame(_currentFrame).getRotation()); + _avatar->setTargetScale(scaleOffset * + _recording->getFrame(_currentFrame).getScale()); + _avatar->setJointRotations(_recording->getFrame(_currentFrame).getJointRotations()); + HeadData* head = const_cast(_avatar->getHeadData()); if (head) { head->setBlendshapeCoefficients(_recording->getFrame(_currentFrame).getBlendshapeCoefficients()); diff --git a/libraries/avatars/src/Recorder.h b/libraries/avatars/src/Recorder.h index 770027a21d..2e4814f9f7 100644 --- a/libraries/avatars/src/Recorder.h +++ b/libraries/avatars/src/Recorder.h @@ -146,7 +146,7 @@ public: public slots: - void startPlaying(); + void startPlaying(bool fromCurrentPosition = false); void stopPlaying(); void loadFromFile(QString file); void loadRecording(RecordingPointer recording); @@ -164,6 +164,10 @@ private: AvatarData* _avatar; QThread* _audioThread; + + glm::vec3 _startingPosition; + glm::quat _startingRotation; + float _startingScale; }; void writeRecordingToFile(RecordingPointer recording, QString file);