adding the anim stack print out feature half way done

This commit is contained in:
amantley 2018-07-27 08:46:40 -07:00
parent fee05b6b8d
commit b28ce40f09
24 changed files with 118 additions and 64 deletions

View file

@ -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;

View file

@ -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()));

View file

@ -135,8 +135,12 @@ private: \
* @property {number} batchFrameTime - <em>Read-only.</em>
* @property {number} engineFrameTime - <em>Read-only.</em>
* @property {number} avatarSimulationTime - <em>Read-only.</em>
* @property {number} animationWeight - <em>Read-only.</em>
* @property {number} animationName - <em>Read-only.</em>
* @property {number} animationWeight1 - <em>Read-only.</em>
* @property {number} animationName1 - <em>Read-only.</em>
* @property {number} animationWeight2 - <em>Read-only.</em>
* @property {number} animationName2 - <em>Read-only.</em>
* @property {number} animationWeight3 - <em>Read-only.</em>
* @property {number} animationName3 - <em>Read-only.</em>
*
*
* @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 <code>animationName</code> property changes.
* @function Stats.animationNameChanged
* @returns {Signal}
*/
void animationNameChanged();
void animationName1Changed();
/**jsdoc
* Triggered when the value of the <code>animationWeight</code> property changes.
* @function Stats.animationWeightChanged
* @returns {Signal}
*/
void animationWeight2Changed();
/**jsdoc
* Triggered when the value of the <code>animationName</code> property changes.
* @function Stats.animationNameChanged
* @returns {Signal}
*/
void animationName2Changed();
/**jsdoc
* Triggered when the value of the <code>animationWeight</code> property changes.
* @function Stats.animationWeightChanged
* @returns {Signal}
*/
void animationWeight3Changed();
/**jsdoc
* Triggered when the value of the <code>animationName</code> property changes.
* @function Stats.animationNameChanged
* @returns {Signal}
*/
void animationName3Changed();
/**jsdoc
* Triggered when the value of the <code>rectifiedTextureCount</code> property changes.

View file

@ -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

View file

@ -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;

View file

@ -46,8 +46,9 @@ static float calculateAlpha(const float speed, const std::vector<float>& 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) {

View file

@ -39,7 +39,7 @@ public:
AnimBlendLinearMove(const QString& id, float alpha, float desiredSpeed, const std::vector<float>& 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);

View file

@ -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);

View file

@ -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; }

View file

@ -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();

View file

@ -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;

View file

@ -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;

View file

@ -52,8 +52,8 @@ public:
const QString& typeVar, const QString& weightVar, float weight, const std::vector<float>& 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();

View file

@ -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;

View file

@ -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; }

View file

@ -12,6 +12,11 @@
#include <QtGlobal>
float AnimNode::_myNum = 42.0;
std::map<QString, float> AnimNode::_animStack = {
{"none", 0.0f}
};
AnimNode::Pointer AnimNode::getParent() {
return _parent.lock();
}

View file

@ -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<QString, float> getAnimStack() { return _animStack; }
template <typename F>
bool traverse(F func) {
@ -120,6 +123,10 @@ protected:
AnimSkeleton::ConstPointer _skeleton;
std::weak_ptr<AnimNode> _parent;
//global available to rig
static float _myNum;
static std::map<QString, float> _animStack;
// no copies
AnimNode(const AnimNode&) = delete;
AnimNode& operator=(const AnimNode&) = delete;

View file

@ -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) {

View file

@ -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.

View file

@ -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; }

View file

@ -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;

View file

@ -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;

View file

@ -575,28 +575,6 @@ bool Rig::getAbsoluteJointPoseInRigFrame(int jointIndex, AnimPose& returnPose) c
}
}
void Rig::calcAnimAlpha(float speed, const std::vector<float>& 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();

View file

@ -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<QString, float> 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,