mirror of
https://github.com/overte-org/overte.git
synced 2025-08-04 23:29:39 +02:00
adding the anim stack print out feature half way done
This commit is contained in:
parent
fee05b6b8d
commit
b28ce40f09
24 changed files with 118 additions and 64 deletions
|
@ -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;
|
||||
|
|
|
@ -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()));
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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; }
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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();
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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; }
|
||||
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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; }
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Reference in a new issue