mirror of
https://github.com/overte-org/overte.git
synced 2025-08-08 11:17:34 +02:00
Added option to playback from current location
This commit is contained in:
parent
dda02b5dcf
commit
41461cd322
5 changed files with 43 additions and 22 deletions
|
@ -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)) {
|
||||||
|
|
|
@ -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() {
|
||||||
|
|
|
@ -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();
|
||||||
|
|
||||||
|
|
|
@ -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());
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in a new issue