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,