diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index f6ec1242f2..d35a1a08f6 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -714,8 +714,12 @@ void MyAvatar::setEnableRigAnimations(bool isEnabled) { void MyAvatar::setEnableAnimGraph(bool isEnabled) { _rig->setEnableAnimGraph(isEnabled); - if (!isEnabled) { - // AJT: TODO: FIXME: currently setEnableAnimGraph menu item only works on startup + if (isEnabled) { + if (_skeletonModel.readyToAddToScene()) { + initAnimGraph(); + } + } else { + destroyAnimGraph(); } } @@ -1234,6 +1238,20 @@ void MyAvatar::initHeadBones() { } } +void MyAvatar::initAnimGraph() { + // https://gist.github.com/hyperlogic/7d6a0892a7319c69e2b9 + // python2 -m SimpleHTTPServer& + //auto graphUrl = QUrl("http://localhost:8000/avatar.json"); + auto graphUrl = QUrl("https://gist.githubusercontent.com/hyperlogic/7d6a0892a7319c69e2b9/raw/e2cb37aee601b6fba31d60eac3f6ae3ef72d4a66/avatar.json"); + _skeletonModel.initAnimGraph(graphUrl, _skeletonModel.getGeometry()->getFBXGeometry()); +} + +void MyAvatar::destroyAnimGraph() { + _rig->destroyAnimGraph(); + AnimDebugDraw::getInstance().removeSkeleton("myAvatar"); + AnimDebugDraw::getInstance().removeAnimNode("myAvatar"); +} + void MyAvatar::preRender(RenderArgs* renderArgs) { render::ScenePointer scene = Application::getInstance()->getMain3DScene(); @@ -1241,15 +1259,8 @@ void MyAvatar::preRender(RenderArgs* renderArgs) { if (_skeletonModel.initWhenReady(scene)) { initHeadBones(); - _skeletonModel.setCauterizeBoneSet(_headBoneSet); - - // https://gist.github.com/hyperlogic/7d6a0892a7319c69e2b9 - // python2 -m SimpleHTTPServer& - //auto graphUrl = QUrl("http://localhost:8000/avatar.json"); - auto graphUrl = QUrl("https://gist.githubusercontent.com/hyperlogic/7d6a0892a7319c69e2b9/raw/e2cb37aee601b6fba31d60eac3f6ae3ef72d4a66/avatar.json"); - - _skeletonModel.initAnimGraph(graphUrl, _skeletonModel.getGeometry()->getFBXGeometry()); + initAnimGraph(); } if (_enableDebugDrawBindPose || _enableDebugDrawAnimPose) { diff --git a/interface/src/avatar/MyAvatar.h b/interface/src/avatar/MyAvatar.h index 1774eec71f..83bfb0f808 100644 --- a/interface/src/avatar/MyAvatar.h +++ b/interface/src/avatar/MyAvatar.h @@ -291,6 +291,8 @@ private: void updateCollisionSound(const glm::vec3& penetration, float deltaTime, float frequency); void maybeUpdateBillboard(); void initHeadBones(); + void initAnimGraph(); + void destroyAnimGraph(); // Avatar Preferences QUrl _fullAvatarURLFromPreferences; diff --git a/libraries/animation/src/Rig.cpp b/libraries/animation/src/Rig.cpp index b4652d24ef..4abef61ddc 100644 --- a/libraries/animation/src/Rig.cpp +++ b/libraries/animation/src/Rig.cpp @@ -187,12 +187,13 @@ void Rig::deleteAnimations() { removeAnimationHandle(animation); } _animationHandles.clear(); + destroyAnimGraph(); +} - if (_enableAnimGraph) { - _animSkeleton = nullptr; - _animLoader = nullptr; - _animNode = nullptr; - } +void Rig::destroyAnimGraph() { + _animSkeleton = nullptr; + _animLoader = nullptr; + _animNode = nullptr; } void Rig::initJointStates(QVector states, glm::mat4 rootTransform, diff --git a/libraries/animation/src/Rig.h b/libraries/animation/src/Rig.h index 109605587e..c264d348f4 100644 --- a/libraries/animation/src/Rig.h +++ b/libraries/animation/src/Rig.h @@ -83,6 +83,7 @@ public: bool isRunningRole(const QString& role); // There can be multiple animations per role, so this is more general than isRunningAnimation. const QList& getRunningAnimations() const { return _runningAnimations; } void deleteAnimations(); + void destroyAnimGraph(); const QList& getAnimationHandles() const { return _animationHandles; } void startAnimation(const QString& url, float fps = 30.0f, float priority = 1.0f, bool loop = false, bool hold = false, float firstFrame = 0.0f, float lastFrame = FLT_MAX, const QStringList& maskedJoints = QStringList()); @@ -193,8 +194,8 @@ public: QList _animationHandles; QList _runningAnimations; - bool _enableRig; - bool _enableAnimGraph; + bool _enableRig = false; + bool _enableAnimGraph = false; glm::vec3 _lastFront; glm::vec3 _lastPosition;