diff --git a/interface/resources/qml/Stats.qml b/interface/resources/qml/Stats.qml index f9824b2364..b1d397553c 100644 --- a/interface/resources/qml/Stats.qml +++ b/interface/resources/qml/Stats.qml @@ -174,7 +174,13 @@ Item { text: "Yaw: " + root.yaw.toFixed(1) } StatText { - text: "Animation Name: " + root.animationName + " Weight: " + root.animationWeight.toFixed(1) + text: "Animation1 Name: " + root.animationName1 + " Weight: " + root.animationWeight1.toFixed(1) + } + StatText { + text: "Animation2 Name: " + root.animationName2 + " Weight: " + root.animationWeight2.toFixed(1) + } + StatText { + text: "Animation3 Name: " + root.animationName3 + " Weight: " + root.animationWeight3.toFixed(1) } StatText { visible: root.expanded; diff --git a/interface/src/ui/Stats.cpp b/interface/src/ui/Stats.cpp index 91ca5679a7..c344c93ed2 100644 --- a/interface/src/ui/Stats.cpp +++ b/interface/src/ui/Stats.cpp @@ -192,10 +192,14 @@ void Stats::updateStats(bool force) { // Third column, avatar stats auto myAvatar = avatarManager->getMyAvatar(); auto rigCopy = myAvatar->getSkeletonModel(); - auto forwardAlpha = 0.2f;//rigCopy->getRig().getFwdAlpha(); + auto forwardAlpha = rigCopy->getRig().getFwdAlpha(); + auto animStack = rigCopy->getRig().getAnimStack(); + for (auto animStackIterator = animStack.begin(); animStackIterator != animStack.end(); ++animStackIterator) { + //animStackIterator->first + } //auto backwardAlpha = rigCopy->getRig().getBwdAlpha(); //auto lateralAlpha = rigCopy->getRig().getLateralAlpha(); - QString animName("anim number 1"); + QString animName(rigCopy->getRig().getAnimation1Name()); glm::vec3 avatarPos = myAvatar->getWorldPosition(); STAT_UPDATE(position, QVector3D(avatarPos.x, avatarPos.y, avatarPos.z)); @@ -352,9 +356,12 @@ void Stats::updateStats(bool force) { auto config = qApp->getRenderEngine()->getConfiguration().get(); STAT_UPDATE(engineFrameTime, (float) config->getCPURunTime()); STAT_UPDATE(avatarSimulationTime, (float)avatarManager->getAvatarSimulationTime()); - STAT_UPDATE(animationWeight, (float)forwardAlpha); - STAT_UPDATE(animationName, (QString)animName); - + STAT_UPDATE(animationWeight1, (float)forwardAlpha); + STAT_UPDATE(animationName1, (QString)animName); + STAT_UPDATE(animationWeight2, (float)forwardAlpha); + STAT_UPDATE(animationName2, (QString)animName); + STAT_UPDATE(animationWeight3, (float)forwardAlpha); + STAT_UPDATE(animationName3, (QString)animName); STAT_UPDATE(gpuBuffers, (int)gpu::Context::getBufferGPUCount()); STAT_UPDATE(gpuBufferMemory, (int)BYTES_TO_MB(gpu::Context::getBufferGPUMemSize())); diff --git a/interface/src/ui/Stats.h b/interface/src/ui/Stats.h index d49090d48d..c908e325b0 100644 --- a/interface/src/ui/Stats.h +++ b/interface/src/ui/Stats.h @@ -135,8 +135,12 @@ private: \ * @property {number} batchFrameTime - Read-only. * @property {number} engineFrameTime - Read-only. * @property {number} avatarSimulationTime - Read-only. - * @property {number} animationWeight - Read-only. - * @property {number} animationName - Read-only. + * @property {number} animationWeight1 - Read-only. + * @property {number} animationName1 - Read-only. + * @property {number} animationWeight2 - Read-only. + * @property {number} animationName2 - Read-only. + * @property {number} animationWeight3 - Read-only. + * @property {number} animationName3 - Read-only. * * * @property {number} x @@ -284,8 +288,12 @@ class Stats : public QQuickItem { STATS_PROPERTY(float, batchFrameTime, 0) STATS_PROPERTY(float, engineFrameTime, 0) STATS_PROPERTY(float, avatarSimulationTime, 0) - STATS_PROPERTY(float, animationWeight, 0) - STATS_PROPERTY(QString, animationName, QString()) + STATS_PROPERTY(float, animationWeight1, 0) + STATS_PROPERTY(QString, animationName1, QString()) + STATS_PROPERTY(float, animationWeight2, 0) + STATS_PROPERTY(QString, animationName2, QString()) + STATS_PROPERTY(float, animationWeight3, 0) + STATS_PROPERTY(QString, animationName3, QString()) public: static Stats* getInstance(); @@ -1008,14 +1016,43 @@ signals: * @function Stats.animationWeightChanged * @returns {Signal} */ - void animationWeightChanged(); + void animationWeight1Changed(); /**jsdoc * Triggered when the value of the animationName property changes. * @function Stats.animationNameChanged * @returns {Signal} */ - void animationNameChanged(); + void animationName1Changed(); + + /**jsdoc + * Triggered when the value of the animationWeight property changes. + * @function Stats.animationWeightChanged + * @returns {Signal} + */ + void animationWeight2Changed(); + + /**jsdoc + * Triggered when the value of the animationName property changes. + * @function Stats.animationNameChanged + * @returns {Signal} + */ + + void animationName2Changed(); + /**jsdoc + * Triggered when the value of the animationWeight property changes. + * @function Stats.animationWeightChanged + * @returns {Signal} + */ + + void animationWeight3Changed(); + + /**jsdoc + * Triggered when the value of the animationName property changes. + * @function Stats.animationNameChanged + * @returns {Signal} + */ + void animationName3Changed(); /**jsdoc * Triggered when the value of the rectifiedTextureCount property changes. diff --git a/libraries/animation/src/AnimBlendLinear.cpp b/libraries/animation/src/AnimBlendLinear.cpp index a83d0160ee..21539aba08 100644 --- a/libraries/animation/src/AnimBlendLinear.cpp +++ b/libraries/animation/src/AnimBlendLinear.cpp @@ -24,7 +24,7 @@ AnimBlendLinear::~AnimBlendLinear() { } -const AnimPoseVec& AnimBlendLinear::evaluate(const AnimVariantMap& animVars, const AnimContext& context, float dt, Triggers& triggersOut) { +const AnimPoseVec& AnimBlendLinear::evaluate(AnimVariantMap& animVars, const AnimContext& context, float dt, Triggers& triggersOut) { qCDebug(animation) << "in blend linear ++++++++++++++++" << _alphaVar << ": " << _alpha; _alpha = animVars.lookup(_alphaVar, _alpha); @@ -51,7 +51,7 @@ const AnimPoseVec& AnimBlendLinear::getPosesInternal() const { return _poses; } -void AnimBlendLinear::evaluateAndBlendChildren(const AnimVariantMap& animVars, const AnimContext& context, Triggers& triggersOut, float alpha, +void AnimBlendLinear::evaluateAndBlendChildren(AnimVariantMap& animVars, const AnimContext& context, Triggers& triggersOut, float alpha, size_t prevPoseIndex, size_t nextPoseIndex, float dt) { if (prevPoseIndex == nextPoseIndex) { // this can happen if alpha is on an integer boundary diff --git a/libraries/animation/src/AnimBlendLinear.h b/libraries/animation/src/AnimBlendLinear.h index 0dae6aabdb..63c1990201 100644 --- a/libraries/animation/src/AnimBlendLinear.h +++ b/libraries/animation/src/AnimBlendLinear.h @@ -30,7 +30,7 @@ public: AnimBlendLinear(const QString& id, float alpha); virtual ~AnimBlendLinear() override; - virtual const AnimPoseVec& evaluate(const AnimVariantMap& animVars, const AnimContext& context, float dt, Triggers& triggersOut) override; + virtual const AnimPoseVec& evaluate(AnimVariantMap& animVars, const AnimContext& context, float dt, Triggers& triggersOut) override; void setAlphaVar(const QString& alphaVar) { _alphaVar = alphaVar; } @@ -38,7 +38,7 @@ protected: // for AnimDebugDraw rendering virtual const AnimPoseVec& getPosesInternal() const override; - void evaluateAndBlendChildren(const AnimVariantMap& animVars, const AnimContext& context, Triggers& triggersOut, float alpha, + void evaluateAndBlendChildren(AnimVariantMap& animVars, const AnimContext& context, Triggers& triggersOut, float alpha, size_t prevPoseIndex, size_t nextPoseIndex, float dt); AnimPoseVec _poses; diff --git a/libraries/animation/src/AnimBlendLinearMove.cpp b/libraries/animation/src/AnimBlendLinearMove.cpp index a4d211e68a..f9ae7aad76 100644 --- a/libraries/animation/src/AnimBlendLinearMove.cpp +++ b/libraries/animation/src/AnimBlendLinearMove.cpp @@ -46,8 +46,9 @@ static float calculateAlpha(const float speed, const std::vector& charact return alpha; } -const AnimPoseVec& AnimBlendLinearMove::evaluate(const AnimVariantMap& animVars, const AnimContext& context, float dt, Triggers& triggersOut) { +const AnimPoseVec& AnimBlendLinearMove::evaluate(AnimVariantMap& animVars, const AnimContext& context, float dt, Triggers& triggersOut) { qCDebug(animation) << "in blend linear move " << _alphaVar << ": " << _alpha; + setMyNum(getMyNum() + 1.0f); assert(_children.size() == _characteristicSpeeds.size()); _desiredSpeed = animVars.lookup(_desiredSpeedVar, _desiredSpeed); @@ -92,7 +93,7 @@ const AnimPoseVec& AnimBlendLinearMove::getPosesInternal() const { return _poses; } -void AnimBlendLinearMove::evaluateAndBlendChildren(const AnimVariantMap& animVars, const AnimContext& context, Triggers& triggersOut, float alpha, +void AnimBlendLinearMove::evaluateAndBlendChildren(AnimVariantMap& animVars, const AnimContext& context, Triggers& triggersOut, float alpha, size_t prevPoseIndex, size_t nextPoseIndex, float prevDeltaTime, float nextDeltaTime) { if (prevPoseIndex == nextPoseIndex) { diff --git a/libraries/animation/src/AnimBlendLinearMove.h b/libraries/animation/src/AnimBlendLinearMove.h index 083858f873..7e6be638d3 100644 --- a/libraries/animation/src/AnimBlendLinearMove.h +++ b/libraries/animation/src/AnimBlendLinearMove.h @@ -39,7 +39,7 @@ public: AnimBlendLinearMove(const QString& id, float alpha, float desiredSpeed, const std::vector& characteristicSpeeds); virtual ~AnimBlendLinearMove() override; - virtual const AnimPoseVec& evaluate(const AnimVariantMap& animVars, const AnimContext& context, float dt, Triggers& triggersOut) override; + virtual const AnimPoseVec& evaluate(AnimVariantMap& animVars, const AnimContext& context, float dt, Triggers& triggersOut) override; void setAlphaVar(const QString& alphaVar) { _alphaVar = alphaVar; } void setDesiredSpeedVar(const QString& desiredSpeedVar) { _desiredSpeedVar = desiredSpeedVar; } @@ -48,7 +48,7 @@ protected: // for AnimDebugDraw rendering virtual const AnimPoseVec& getPosesInternal() const override; - void evaluateAndBlendChildren(const AnimVariantMap& animVars, const AnimContext& context, Triggers& triggersOut, float alpha, + void evaluateAndBlendChildren(AnimVariantMap& animVars, const AnimContext& context, Triggers& triggersOut, float alpha, size_t prevPoseIndex, size_t nextPoseIndex, float prevDeltaTime, float nextDeltaTime); diff --git a/libraries/animation/src/AnimClip.cpp b/libraries/animation/src/AnimClip.cpp index 598b32c862..abed4636d9 100644 --- a/libraries/animation/src/AnimClip.cpp +++ b/libraries/animation/src/AnimClip.cpp @@ -30,7 +30,7 @@ AnimClip::~AnimClip() { } -const AnimPoseVec& AnimClip::evaluate(const AnimVariantMap& animVars, const AnimContext& context, float dt, Triggers& triggersOut) { +const AnimPoseVec& AnimClip::evaluate(AnimVariantMap& animVars, const AnimContext& context, float dt, Triggers& triggersOut) { qCDebug(animation) << "anim clip is: " << _url; // lookup parameters from animVars, using current instance variables as defaults. _startFrame = animVars.lookup(_startFrameVar, _startFrame); diff --git a/libraries/animation/src/AnimClip.h b/libraries/animation/src/AnimClip.h index 717972ca26..d929ad4663 100644 --- a/libraries/animation/src/AnimClip.h +++ b/libraries/animation/src/AnimClip.h @@ -28,7 +28,7 @@ public: AnimClip(const QString& id, const QString& url, float startFrame, float endFrame, float timeScale, bool loopFlag, bool mirrorFlag); virtual ~AnimClip() override; - virtual const AnimPoseVec& evaluate(const AnimVariantMap& animVars, const AnimContext& context, float dt, Triggers& triggersOut) override; + virtual const AnimPoseVec& evaluate(AnimVariantMap& animVars, const AnimContext& context, float dt, Triggers& triggersOut) override; void setStartFrameVar(const QString& startFrameVar) { _startFrameVar = startFrameVar; } void setEndFrameVar(const QString& endFrameVar) { _endFrameVar = endFrameVar; } diff --git a/libraries/animation/src/AnimDefaultPose.cpp b/libraries/animation/src/AnimDefaultPose.cpp index 8647c5a7ac..0cedf4938d 100644 --- a/libraries/animation/src/AnimDefaultPose.cpp +++ b/libraries/animation/src/AnimDefaultPose.cpp @@ -20,7 +20,7 @@ AnimDefaultPose::~AnimDefaultPose() { } -const AnimPoseVec& AnimDefaultPose::evaluate(const AnimVariantMap& animVars, const AnimContext& context, float dt, Triggers& triggersOut) { +const AnimPoseVec& AnimDefaultPose::evaluate(AnimVariantMap& animVars, const AnimContext& context, float dt, Triggers& triggersOut) { qCDebug(animation) << "in animation default pose"; if (_skeleton) { _poses = _skeleton->getRelativeDefaultPoses(); diff --git a/libraries/animation/src/AnimDefaultPose.h b/libraries/animation/src/AnimDefaultPose.h index eefefac7af..e9433268d4 100644 --- a/libraries/animation/src/AnimDefaultPose.h +++ b/libraries/animation/src/AnimDefaultPose.h @@ -21,7 +21,7 @@ public: AnimDefaultPose(const QString& id); virtual ~AnimDefaultPose() override; - virtual const AnimPoseVec& evaluate(const AnimVariantMap& animVars, const AnimContext& context, float dt, Triggers& triggersOut) override; + virtual const AnimPoseVec& evaluate(AnimVariantMap& animVars, const AnimContext& context, float dt, Triggers& triggersOut) override; protected: // for AnimDebugDraw rendering virtual const AnimPoseVec& getPosesInternal() const override; diff --git a/libraries/animation/src/AnimInverseKinematics.cpp b/libraries/animation/src/AnimInverseKinematics.cpp index 7bd1e3b445..43b975b829 100644 --- a/libraries/animation/src/AnimInverseKinematics.cpp +++ b/libraries/animation/src/AnimInverseKinematics.cpp @@ -874,7 +874,7 @@ void AnimInverseKinematics::solveTargetWithSpline(const AnimContext& context, co } //virtual -const AnimPoseVec& AnimInverseKinematics::evaluate(const AnimVariantMap& animVars, const AnimContext& context, float dt, AnimNode::Triggers& triggersOut) { +const AnimPoseVec& AnimInverseKinematics::evaluate(AnimVariantMap& animVars, const AnimContext& context, float dt, AnimNode::Triggers& triggersOut) { qCDebug(animation) << "in animation ik node"; // don't call this function, call overlay() instead assert(false); @@ -882,7 +882,7 @@ const AnimPoseVec& AnimInverseKinematics::evaluate(const AnimVariantMap& animVar } //virtual -const AnimPoseVec& AnimInverseKinematics::overlay(const AnimVariantMap& animVars, const AnimContext& context, float dt, Triggers& triggersOut, const AnimPoseVec& underPoses) { +const AnimPoseVec& AnimInverseKinematics::overlay(AnimVariantMap& animVars, const AnimContext& context, float dt, Triggers& triggersOut, const AnimPoseVec& underPoses) { #ifdef Q_OS_ANDROID // disable IK on android return underPoses; diff --git a/libraries/animation/src/AnimInverseKinematics.h b/libraries/animation/src/AnimInverseKinematics.h index ee1f9f43ad..40b1bdc1d0 100644 --- a/libraries/animation/src/AnimInverseKinematics.h +++ b/libraries/animation/src/AnimInverseKinematics.h @@ -52,8 +52,8 @@ public: const QString& typeVar, const QString& weightVar, float weight, const std::vector& flexCoefficients, const QString& poleVectorEnabledVar, const QString& poleReferenceVectorVar, const QString& poleVectorVar); - virtual const AnimPoseVec& evaluate(const AnimVariantMap& animVars, const AnimContext& context, float dt, AnimNode::Triggers& triggersOut) override; - virtual const AnimPoseVec& overlay(const AnimVariantMap& animVars, const AnimContext& context, float dt, Triggers& triggersOut, const AnimPoseVec& underPoses) override; + virtual const AnimPoseVec& evaluate(AnimVariantMap& animVars, const AnimContext& context, float dt, AnimNode::Triggers& triggersOut) override; + virtual const AnimPoseVec& overlay(AnimVariantMap& animVars, const AnimContext& context, float dt, Triggers& triggersOut, const AnimPoseVec& underPoses) override; void clearIKJointLimitHistory(); diff --git a/libraries/animation/src/AnimManipulator.cpp b/libraries/animation/src/AnimManipulator.cpp index f29d5688ee..12afa7ad7d 100644 --- a/libraries/animation/src/AnimManipulator.cpp +++ b/libraries/animation/src/AnimManipulator.cpp @@ -32,12 +32,12 @@ AnimManipulator::~AnimManipulator() { } -const AnimPoseVec& AnimManipulator::evaluate(const AnimVariantMap& animVars, const AnimContext& context, float dt, Triggers& triggersOut) { +const AnimPoseVec& AnimManipulator::evaluate(AnimVariantMap& animVars, const AnimContext& context, float dt, Triggers& triggersOut) { qCDebug(animation) << "in anim manipulator node"; return overlay(animVars, context, dt, triggersOut, _skeleton->getRelativeDefaultPoses()); } -const AnimPoseVec& AnimManipulator::overlay(const AnimVariantMap& animVars, const AnimContext& context, float dt, Triggers& triggersOut, const AnimPoseVec& underPoses) { +const AnimPoseVec& AnimManipulator::overlay(AnimVariantMap& animVars, const AnimContext& context, float dt, Triggers& triggersOut, const AnimPoseVec& underPoses) { _alpha = animVars.lookup(_alphaVar, _alpha); _poses = underPoses; diff --git a/libraries/animation/src/AnimManipulator.h b/libraries/animation/src/AnimManipulator.h index 1134f75da9..fd470de70d 100644 --- a/libraries/animation/src/AnimManipulator.h +++ b/libraries/animation/src/AnimManipulator.h @@ -22,8 +22,8 @@ public: AnimManipulator(const QString& id, float alpha); virtual ~AnimManipulator() override; - virtual const AnimPoseVec& evaluate(const AnimVariantMap& animVars, const AnimContext& context, float dt, Triggers& triggersOut) override; - virtual const AnimPoseVec& overlay(const AnimVariantMap& animVars, const AnimContext& context, float dt, Triggers& triggersOut, const AnimPoseVec& underPoses) override; + virtual const AnimPoseVec& evaluate(AnimVariantMap& animVars, const AnimContext& context, float dt, Triggers& triggersOut) override; + virtual const AnimPoseVec& overlay(AnimVariantMap& animVars, const AnimContext& context, float dt, Triggers& triggersOut, const AnimPoseVec& underPoses) override; void setAlphaVar(const QString& alphaVar) { _alphaVar = alphaVar; } diff --git a/libraries/animation/src/AnimNode.cpp b/libraries/animation/src/AnimNode.cpp index ba8e095109..63724a950e 100644 --- a/libraries/animation/src/AnimNode.cpp +++ b/libraries/animation/src/AnimNode.cpp @@ -12,6 +12,11 @@ #include +float AnimNode::_myNum = 42.0; +std::map AnimNode::_animStack = { + {"none", 0.0f} +}; + AnimNode::Pointer AnimNode::getParent() { return _parent.lock(); } diff --git a/libraries/animation/src/AnimNode.h b/libraries/animation/src/AnimNode.h index 6d9d35b19b..79b8d39392 100644 --- a/libraries/animation/src/AnimNode.h +++ b/libraries/animation/src/AnimNode.h @@ -74,13 +74,16 @@ public: AnimSkeleton::ConstPointer getSkeleton() const { return _skeleton; } - virtual const AnimPoseVec& evaluate(const AnimVariantMap& animVars, const AnimContext& context, float dt, Triggers& triggersOut) = 0; - virtual const AnimPoseVec& overlay(const AnimVariantMap& animVars, const AnimContext& context, float dt, Triggers& triggersOut, + virtual const AnimPoseVec& evaluate(AnimVariantMap& animVars, const AnimContext& context, float dt, Triggers& triggersOut) = 0; + virtual const AnimPoseVec& overlay(AnimVariantMap& animVars, const AnimContext& context, float dt, Triggers& triggersOut, const AnimPoseVec& underPoses) { return evaluate(animVars, context, dt, triggersOut); } void setCurrentFrame(float frame); + const int getMyNum() { return _myNum; } + void setMyNum(float num) { _myNum = num; } + const std::map getAnimStack() { return _animStack; } template bool traverse(F func) { @@ -120,6 +123,10 @@ protected: AnimSkeleton::ConstPointer _skeleton; std::weak_ptr _parent; + //global available to rig + static float _myNum; + static std::map _animStack; + // no copies AnimNode(const AnimNode&) = delete; AnimNode& operator=(const AnimNode&) = delete; diff --git a/libraries/animation/src/AnimNodeLoader.cpp b/libraries/animation/src/AnimNodeLoader.cpp index c39f0f57ae..e29f255ece 100644 --- a/libraries/animation/src/AnimNodeLoader.cpp +++ b/libraries/animation/src/AnimNodeLoader.cpp @@ -585,7 +585,7 @@ bool processStateMachineNode(AnimNode::Pointer node, const QJsonObject& jsonObj, return false; } - AnimStateMachine::InterpType interpTypeEnum = AnimStateMachine::InterpType::SnapshotBoth; // default value + AnimStateMachine::InterpType interpTypeEnum = AnimStateMachine::InterpType::SnapshotPrev; // default value if (!interpType.isEmpty()) { interpTypeEnum = stringToInterpType(interpType); if (interpTypeEnum == AnimStateMachine::InterpType::NumTypes) { diff --git a/libraries/animation/src/AnimOverlay.cpp b/libraries/animation/src/AnimOverlay.cpp index b477449ff9..767824a466 100644 --- a/libraries/animation/src/AnimOverlay.cpp +++ b/libraries/animation/src/AnimOverlay.cpp @@ -41,7 +41,7 @@ void AnimOverlay::buildBoneSet(BoneSet boneSet) { } } -const AnimPoseVec& AnimOverlay::evaluate(const AnimVariantMap& animVars, const AnimContext& context, float dt, Triggers& triggersOut) { +const AnimPoseVec& AnimOverlay::evaluate(AnimVariantMap& animVars, const AnimContext& context, float dt, Triggers& triggersOut) { qCDebug(animation) << "in anim overlay node" << _alphaVar << ": " << _alpha; // lookup parameters from animVars, using current instance variables as defaults. // NOTE: switching bonesets can be an expensive operation, let's try to avoid it. diff --git a/libraries/animation/src/AnimOverlay.h b/libraries/animation/src/AnimOverlay.h index 8b6e1529fc..c87e123209 100644 --- a/libraries/animation/src/AnimOverlay.h +++ b/libraries/animation/src/AnimOverlay.h @@ -45,7 +45,7 @@ public: AnimOverlay(const QString& id, BoneSet boneSet, float alpha); virtual ~AnimOverlay() override; - virtual const AnimPoseVec& evaluate(const AnimVariantMap& animVars, const AnimContext& context, float dt, Triggers& triggersOut) override; + virtual const AnimPoseVec& evaluate(AnimVariantMap& animVars, const AnimContext& context, float dt, Triggers& triggersOut) override; void setBoneSetVar(const QString& boneSetVar) { _boneSetVar = boneSetVar; } void setAlphaVar(const QString& alphaVar) { _alphaVar = alphaVar; } diff --git a/libraries/animation/src/AnimStateMachine.cpp b/libraries/animation/src/AnimStateMachine.cpp index c7d7471dfa..8a84374274 100644 --- a/libraries/animation/src/AnimStateMachine.cpp +++ b/libraries/animation/src/AnimStateMachine.cpp @@ -21,14 +21,22 @@ AnimStateMachine::~AnimStateMachine() { } -const AnimPoseVec& AnimStateMachine::evaluate(const AnimVariantMap& animVars, const AnimContext& context, float dt, Triggers& triggersOut) { +const AnimPoseVec& AnimStateMachine::evaluate(AnimVariantMap& animVars, const AnimContext& context, float dt, Triggers& triggersOut) { qCDebug(animation) << "in anim state machine " << _currentState->getID() << ": " << _alpha; + animVars.set("Animation1", _currentState->getID()); + _animStack[_currentState->getID()] = _alpha; + //setMyNum(getMyNum() + 1.0f); + QString desiredStateID = animVars.lookup(_currentStateVar, _currentState->getID()); if (_currentState->getID() != desiredStateID) { // switch states bool foundState = false; for (auto& state : _states) { if (state->getID() == desiredStateID) { + if (_animStack.count(_currentState->getID()) > 0) { + _animStack.erase(_currentState->getID()); + } + _animStack[desiredStateID] = _alpha; switchState(animVars, context, state); foundState = true; break; @@ -92,7 +100,7 @@ void AnimStateMachine::addState(State::Pointer state) { _states.push_back(state); } -void AnimStateMachine::switchState(const AnimVariantMap& animVars, const AnimContext& context, State::Pointer desiredState) { +void AnimStateMachine::switchState(AnimVariantMap& animVars, const AnimContext& context, State::Pointer desiredState) { const float FRAMES_PER_SECOND = 30.0f; diff --git a/libraries/animation/src/AnimStateMachine.h b/libraries/animation/src/AnimStateMachine.h index 711326a9ae..f25508db9f 100644 --- a/libraries/animation/src/AnimStateMachine.h +++ b/libraries/animation/src/AnimStateMachine.h @@ -113,7 +113,7 @@ public: explicit AnimStateMachine(const QString& id); virtual ~AnimStateMachine() override; - virtual const AnimPoseVec& evaluate(const AnimVariantMap& animVars, const AnimContext& context, float dt, Triggers& triggersOut) override; + virtual const AnimPoseVec& evaluate(AnimVariantMap& animVars, const AnimContext& context, float dt, Triggers& triggersOut) override; void setCurrentStateVar(QString& currentStateVar) { _currentStateVar = currentStateVar; } @@ -123,7 +123,7 @@ protected: void addState(State::Pointer state); - void switchState(const AnimVariantMap& animVars, const AnimContext& context, State::Pointer desiredState); + void switchState(AnimVariantMap& animVars, const AnimContext& context, State::Pointer desiredState); State::Pointer evaluateTransitions(const AnimVariantMap& animVars) const; // for AnimDebugDraw rendering @@ -133,7 +133,7 @@ protected: // interpolation state bool _duringInterp = false; - InterpType _interpType { InterpType::SnapshotBoth }; + InterpType _interpType { InterpType::SnapshotPrev }; float _alphaVel = 0.0f; float _alpha = 0.0f; AnimPoseVec _prevPoses; diff --git a/libraries/animation/src/Rig.cpp b/libraries/animation/src/Rig.cpp index 2f962d791b..ee3e4607c1 100644 --- a/libraries/animation/src/Rig.cpp +++ b/libraries/animation/src/Rig.cpp @@ -575,28 +575,6 @@ bool Rig::getAbsoluteJointPoseInRigFrame(int jointIndex, AnimPose& returnPose) c } } -void Rig::calcAnimAlpha(float speed, const std::vector& referenceSpeeds, float* alphaOut) const { - - ASSERT(referenceSpeeds.size() > 0); - - // calculate alpha from linear combination of referenceSpeeds. - float alpha = 0.0f; - if (speed <= referenceSpeeds.front()) { - alpha = 0.0f; - } else if (speed > referenceSpeeds.back()) { - alpha = (float)(referenceSpeeds.size() - 1); - } else { - for (size_t i = 0; i < referenceSpeeds.size() - 1; i++) { - if (referenceSpeeds[i] < speed && speed < referenceSpeeds[i + 1]) { - alpha = (float)i + ((speed - referenceSpeeds[i]) / (referenceSpeeds[i + 1] - referenceSpeeds[i])); - break; - } - } - } - - *alphaOut = alpha; -} - void Rig::setEnableInverseKinematics(bool enable) { _enableInverseKinematics = enable; } @@ -1032,6 +1010,8 @@ void Rig::updateAnimations(float deltaTime, const glm::mat4& rootTransform, cons AnimNode::Triggers triggersOut; _internalPoseSet._relativePoses = _animNode->evaluate(_animVars, context, deltaTime, triggersOut); + _fwdAlpha = _animNode->getMyNum(); + _animationName1 = _animVars.lookup("Animation1", _animationName1); if ((int)_internalPoseSet._relativePoses.size() != _animSkeleton->getNumJoints()) { // animations haven't fully loaded yet. _internalPoseSet._relativePoses = _animSkeleton->getRelativeDefaultPoses(); diff --git a/libraries/animation/src/Rig.h b/libraries/animation/src/Rig.h index dc9da2ea98..1f3da840b5 100644 --- a/libraries/animation/src/Rig.h +++ b/libraries/animation/src/Rig.h @@ -221,6 +221,8 @@ public: const float getFwdAlpha() const { return _fwdAlpha; } const float getBwdAlpha() const { return _bwdAlpha; } const float getLateralAlpha() { return _lateralAlpha; } + const QString getAnimation1Name() { return _animationName1; } + const std::map getAnimStack() { return _animNode->getAnimStack(); } signals: void onLoadComplete(); @@ -299,6 +301,7 @@ protected: float _fwdAlpha { 0.0f }; float _bwdAlpha { 0.0f }; float _lateralAlpha { 0.0f }; + QString _animationName1 { "none" }; enum class RigRole { Idle = 0, Turn,