Added option to playback from current location

This commit is contained in:
Atlante45 2014-08-26 17:23:50 -07:00
parent dda02b5dcf
commit 41461cd322
5 changed files with 43 additions and 22 deletions

View file

@ -153,7 +153,7 @@ function mousePressEvent(event) {
if (MyAvatar.isPlaying()) { if (MyAvatar.isPlaying()) {
MyAvatar.stopPlaying(); MyAvatar.stopPlaying();
} else { } else {
MyAvatar.startPlaying(); MyAvatar.startPlaying(true);
} }
} }
} else if (saveIcon === toolBar.clicked(clickedOverlay)) { } else if (saveIcon === toolBar.clicked(clickedOverlay)) {

View file

@ -638,16 +638,17 @@ void AvatarData::loadRecording(QString filename) {
_player->loadFromFile(filename); _player->loadFromFile(filename);
} }
void AvatarData::startPlaying() { void AvatarData::startPlaying(bool fromCurrentPosition) {
if (QThread::currentThread() != thread()) { if (QThread::currentThread() != thread()) {
QMetaObject::invokeMethod(this, "startPlaying", Qt::BlockingQueuedConnection); QMetaObject::invokeMethod(this, "startPlaying", Qt::BlockingQueuedConnection,
Q_ARG(bool, fromCurrentPosition));
return; return;
} }
if (!_player) { if (!_player) {
_player = PlayerPointer(new Player(this)); _player = PlayerPointer(new Player(this));
} }
qDebug() << "AvatarData::startPlaying():" << fromCurrentPosition;
_player->startPlaying(); _player->startPlaying(fromCurrentPosition);
} }
void AvatarData::play() { void AvatarData::play() {

View file

@ -303,7 +303,7 @@ public slots:
qint64 playerElapsed(); qint64 playerElapsed();
qint64 playerLength(); qint64 playerLength();
void loadRecording(QString filename); void loadRecording(QString filename);
void startPlaying(); void startPlaying(bool fromCurrentPosition = false);
void play(); void play();
void stopPlaying(); void stopPlaying();

View file

@ -165,7 +165,8 @@ void Recorder::record(char* samples, int size) {
Player::Player(AvatarData* avatar) : Player::Player(AvatarData* avatar) :
_recording(new Recording()), _recording(new Recording()),
_avatar(avatar), _avatar(avatar),
_audioThread(NULL) _audioThread(NULL),
_startingScale(1.0f)
{ {
_timer.invalidate(); _timer.invalidate();
_options.setLoop(false); _options.setLoop(false);
@ -215,7 +216,7 @@ float Player::getLeanForward() {
return _recording->getFrame(_currentFrame).getLeanForward(); return _recording->getFrame(_currentFrame).getLeanForward();
} }
void Player::startPlaying() { void Player::startPlaying(bool fromCurrentPosition) {
if (_recording && _recording->getFrameNumber() > 0) { if (_recording && _recording->getFrameNumber() > 0) {
qDebug() << "Recorder::startPlaying()"; qDebug() << "Recorder::startPlaying()";
_currentFrame = 0; _currentFrame = 0;
@ -232,6 +233,16 @@ void Player::startPlaying() {
// Fake faceshift connection // Fake faceshift connection
_avatar->setForceFaceshiftConnected(true); _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(); _timer.start();
} }
} }
@ -283,20 +294,25 @@ void Player::play() {
return; return;
} }
if (_currentFrame == 0) { glm::vec3 positionOffset;
_avatar->setPosition(_recording->getFrame(_currentFrame).getTranslation()); glm::quat rotationOffset;
_avatar->setOrientation(_recording->getFrame(_currentFrame).getRotation()); float scaleOffset = 1.0f;
_avatar->setTargetScale(_recording->getFrame(_currentFrame).getScale());
_avatar->setJointRotations(_recording->getFrame(_currentFrame).getJointRotations()); if (_currentFrame > 0) {
} else { positionOffset = _startingPosition;
_avatar->setPosition(_recording->getFrame(0).getTranslation() + rotationOffset = _startingRotation;
scaleOffset = _startingScale;
}
_avatar->setPosition(positionOffset +
glm::inverse(_recording->getFrame(0).getRotation()) * rotationOffset *
_recording->getFrame(_currentFrame).getTranslation()); _recording->getFrame(_currentFrame).getTranslation());
_avatar->setOrientation(_recording->getFrame(0).getRotation() * _avatar->setOrientation(rotationOffset *
_recording->getFrame(_currentFrame).getRotation()); _recording->getFrame(_currentFrame).getRotation());
_avatar->setTargetScale(_recording->getFrame(0).getScale() * _avatar->setTargetScale(scaleOffset *
_recording->getFrame(_currentFrame).getScale()); _recording->getFrame(_currentFrame).getScale());
_avatar->setJointRotations(_recording->getFrame(_currentFrame).getJointRotations()); _avatar->setJointRotations(_recording->getFrame(_currentFrame).getJointRotations());
}
HeadData* head = const_cast<HeadData*>(_avatar->getHeadData()); HeadData* head = const_cast<HeadData*>(_avatar->getHeadData());
if (head) { if (head) {
head->setBlendshapeCoefficients(_recording->getFrame(_currentFrame).getBlendshapeCoefficients()); head->setBlendshapeCoefficients(_recording->getFrame(_currentFrame).getBlendshapeCoefficients());

View file

@ -146,7 +146,7 @@ public:
public slots: public slots:
void startPlaying(); void startPlaying(bool fromCurrentPosition = false);
void stopPlaying(); void stopPlaying();
void loadFromFile(QString file); void loadFromFile(QString file);
void loadRecording(RecordingPointer recording); void loadRecording(RecordingPointer recording);
@ -164,6 +164,10 @@ private:
AvatarData* _avatar; AvatarData* _avatar;
QThread* _audioThread; QThread* _audioThread;
glm::vec3 _startingPosition;
glm::quat _startingRotation;
float _startingScale;
}; };
void writeRecordingToFile(RecordingPointer recording, QString file); void writeRecordingToFile(RecordingPointer recording, QString file);