diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 5f43b834ec..1e093f7d43 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -1254,6 +1254,16 @@ void MyAvatar::initHeadBones() { } } +void MyAvatar::setAnimGraphUrl(const QUrl& url) { + if (_animGraphUrl == url) { + return; + } + destroyAnimGraph(); + _skeletonModel.reset(); // Why is this necessary? Without this, we crash in the next render. + _animGraphUrl = url; + initAnimGraph(); +} + void MyAvatar::initAnimGraph() { // avatar.json // https://gist.github.com/hyperlogic/7d6a0892a7319c69e2b9 @@ -1270,9 +1280,9 @@ void MyAvatar::initAnimGraph() { // or run a local web-server // python -m SimpleHTTPServer& //auto graphUrl = QUrl("http://localhost:8000/avatar.json"); - auto graphUrl = QUrl(_animGraphUrl.isEmpty() ? - QUrl::fromLocalFile(PathUtils::resourcesPath() + "meshes/defaultAvatar_full/avatar-animation.json") : - _animGraphUrl); + auto graphUrl =_animGraphUrl.isEmpty() ? + QUrl::fromLocalFile(PathUtils::resourcesPath() + "meshes/defaultAvatar_full/avatar-animation.json") : + QUrl(_animGraphUrl); _rig->initAnimGraph(graphUrl); _bodySensorMatrix = deriveBodyFromHMDSensor(); // Based on current cached HMD position/rotation.. diff --git a/interface/src/avatar/MyAvatar.h b/interface/src/avatar/MyAvatar.h index 351231578d..b93a1738de 100644 --- a/interface/src/avatar/MyAvatar.h +++ b/interface/src/avatar/MyAvatar.h @@ -249,13 +249,13 @@ public slots: virtual void rebuildSkeletonBody() override; - const QString& getAnimGraphUrl() const { return _animGraphUrl; } + Q_INVOKABLE QUrl getAnimGraphUrl() const { return _animGraphUrl; } void setEnableDebugDrawDefaultPose(bool isEnabled); void setEnableDebugDrawAnimPose(bool isEnabled); void setEnableDebugDrawPosition(bool isEnabled); void setEnableMeshVisible(bool isEnabled); - void setAnimGraphUrl(const QString& url) { _animGraphUrl = url; } + Q_INVOKABLE void setAnimGraphUrl(const QUrl& url); glm::vec3 getPositionForAudio(); glm::quat getOrientationForAudio(); @@ -356,7 +356,7 @@ private: // Avatar Preferences QUrl _fullAvatarURLFromPreferences; QString _fullAvatarModelName; - QString _animGraphUrl {""}; + QUrl _animGraphUrl {""}; // cache of the current HMD sensor position and orientation // in sensor space. diff --git a/interface/src/ui/PreferencesDialog.cpp b/interface/src/ui/PreferencesDialog.cpp index 6b05ee9664..89c82a1c97 100644 --- a/interface/src/ui/PreferencesDialog.cpp +++ b/interface/src/ui/PreferencesDialog.cpp @@ -188,9 +188,9 @@ void PreferencesDialog::loadPreferences() { ui.fieldOfViewSpin->setValue(qApp->getFieldOfView()); ui.leanScaleSpin->setValue(myAvatar->getLeanScale()); - + ui.avatarScaleSpin->setValue(myAvatar->getAvatarScale()); - ui.avatarAnimationEdit->setText(myAvatar->getAnimGraphUrl()); + ui.avatarAnimationEdit->setText(myAvatar->getAnimGraphUrl().toString()); ui.maxOctreePPSSpin->setValue(qApp->getMaxOctreePacketsPerSecond());