From 4903db45b14800cad0200f85b97bb1c7a13b0520 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Thu, 15 Oct 2015 14:21:06 -0700 Subject: [PATCH] give other avatars an anim-skeleton --- interface/src/avatar/AvatarActionHold.cpp | 3 +++ interface/src/avatar/SkeletonModel.cpp | 12 ++++++------ libraries/animation/src/Rig.cpp | 8 +++++++- libraries/animation/src/Rig.h | 1 + libraries/render-utils/src/Model.cpp | 2 ++ 5 files changed, 19 insertions(+), 7 deletions(-) diff --git a/interface/src/avatar/AvatarActionHold.cpp b/interface/src/avatar/AvatarActionHold.cpp index f12909e809..018108ac52 100644 --- a/interface/src/avatar/AvatarActionHold.cpp +++ b/interface/src/avatar/AvatarActionHold.cpp @@ -70,6 +70,9 @@ void AvatarActionHold::updateActionWorker(float deltaTimeStep) { gotLock = withTryWriteLock([&]{ _positionalTarget = position; _rotationalTarget = rotation; + _positionalTargetSet = true; + _rotationalTargetSet = true; + _active = true; }); } if (gotLock) { diff --git a/interface/src/avatar/SkeletonModel.cpp b/interface/src/avatar/SkeletonModel.cpp index 312b7cbf44..28c7941c52 100644 --- a/interface/src/avatar/SkeletonModel.cpp +++ b/interface/src/avatar/SkeletonModel.cpp @@ -229,6 +229,12 @@ void SkeletonModel::simulate(float deltaTime, bool fullUpdate) { Model::simulate(deltaTime, fullUpdate); + // let rig compute the model offset + glm::vec3 modelOffset; + if (_rig->getModelOffset(modelOffset)) { + setOffset(modelOffset); + } + if (!isActive() || !_owningAvatar->isMyAvatar()) { return; // only simulate for own avatar } @@ -246,12 +252,6 @@ void SkeletonModel::simulate(float deltaTime, bool fullUpdate) { Hand* hand = _owningAvatar->getHand(); hand->getLeftRightPalmIndices(leftPalmIndex, rightPalmIndex); - // let rig compute the model offset - glm::vec3 modelOffset; - if (_rig->getModelOffset(modelOffset)) { - setOffset(modelOffset); - } - // Don't Relax toward hand positions when in animGraph mode. if (!_rig->getEnableAnimGraph()) { const float HAND_RESTORATION_RATE = 0.25f; diff --git a/libraries/animation/src/Rig.cpp b/libraries/animation/src/Rig.cpp index 241fdf10bc..fd764964a4 100644 --- a/libraries/animation/src/Rig.cpp +++ b/libraries/animation/src/Rig.cpp @@ -1245,12 +1245,18 @@ void Rig::updateFromHandParameters(const HandParameters& params, float dt) { } } +void Rig::makeAnimSkeleton(const FBXGeometry& fbxGeometry) { + if (!_animSkeleton) { + _animSkeleton = std::make_shared(fbxGeometry); + } +} + void Rig::initAnimGraph(const QUrl& url, const FBXGeometry& fbxGeometry) { if (!_enableAnimGraph) { return; } - _animSkeleton = std::make_shared(fbxGeometry); + makeAnimSkeleton(fbxGeometry); // load the anim graph _animLoader.reset(new AnimNodeLoader(url)); diff --git a/libraries/animation/src/Rig.h b/libraries/animation/src/Rig.h index 71c27e7213..c9c42cbbb6 100644 --- a/libraries/animation/src/Rig.h +++ b/libraries/animation/src/Rig.h @@ -193,6 +193,7 @@ public: virtual void setHandPosition(int jointIndex, const glm::vec3& position, const glm::quat& rotation, float scale, float priority) = 0; + void makeAnimSkeleton(const FBXGeometry& fbxGeometry); void initAnimGraph(const QUrl& url, const FBXGeometry& fbxGeometry); AnimNode::ConstPointer getAnimNode() const { return _animNode; } diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index 38f5ffdabe..6aae7ad1cb 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -1147,6 +1147,8 @@ void Model::segregateMeshGroups() { const FBXGeometry& geometry = _geometry->getFBXGeometry(); const std::vector>& networkMeshes = _geometry->getMeshes(); + _rig->makeAnimSkeleton(geometry); + // all of our mesh vectors must match in size if ((int)networkMeshes.size() != geometry.meshes.size() || geometry.meshes.size() != _meshStates.size()) {