From 0c02a338f220dbcceb607cca29563393ad45e80b Mon Sep 17 00:00:00 2001 From: "Anthony J. Thibault" Date: Tue, 25 Aug 2015 20:57:01 -0700 Subject: [PATCH] Added support for setting Variants in the json file. For example: the avatar.json file was updated to use the "sine" Variant to drive the Overlay alpha parameter. --- interface/src/avatar/MyAvatar.cpp | 3 +- libraries/animation/src/AnimBlendLinear.h | 2 +- libraries/animation/src/AnimClip.h | 6 +-- libraries/animation/src/AnimNodeLoader.cpp | 54 ++++++++++++++++++++-- libraries/animation/src/AnimOverlay.h | 8 ++-- tests/animation/src/data/avatar.json | 3 +- 6 files changed, 63 insertions(+), 13 deletions(-) diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 48fb2c1801..d19254892d 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -1232,7 +1232,8 @@ void MyAvatar::setupNewAnimationSystem() { //AnimDebugDraw::getInstance().addSkeleton("my-avatar", _animSkeleton, xform); // load the anim graph - auto graphUrl = QUrl("https://gist.githubusercontent.com/hyperlogic/7d6a0892a7319c69e2b9/raw/a939eadee4f36248776913d42891954a8d009158/avatar.json"); + // https://gist.github.com/hyperlogic/7d6a0892a7319c69e2b9 + auto graphUrl = QUrl("https://gist.githubusercontent.com/hyperlogic/7d6a0892a7319c69e2b9/raw/c4a9223e97b1d00b423b87542a2a57895ca72d21/avatar.json"); _animLoader.reset(new AnimNodeLoader(graphUrl)); connect(_animLoader.get(), &AnimNodeLoader::success, [this](AnimNode::Pointer nodeIn) { _animNode = nodeIn; diff --git a/libraries/animation/src/AnimBlendLinear.h b/libraries/animation/src/AnimBlendLinear.h index 85799ad3e3..2df1965064 100644 --- a/libraries/animation/src/AnimBlendLinear.h +++ b/libraries/animation/src/AnimBlendLinear.h @@ -31,9 +31,9 @@ public: virtual const AnimPoseVec& evaluate(const AnimVariantMap& animVars, float dt) override; -protected: void setAlphaVar(const std::string& alphaVar) { _alphaVar = alphaVar; } +protected: // for AnimDebugDraw rendering virtual const AnimPoseVec& getPosesInternal() const override; diff --git a/libraries/animation/src/AnimClip.h b/libraries/animation/src/AnimClip.h index e4651e0ece..45924c1eed 100644 --- a/libraries/animation/src/AnimClip.h +++ b/libraries/animation/src/AnimClip.h @@ -29,15 +29,15 @@ public: virtual const AnimPoseVec& evaluate(const AnimVariantMap& animVars, float dt) override; -protected: - void loadURL(const std::string& url); - void setStartFrameVar(const std::string& startFrameVar) { _startFrameVar = startFrameVar; } void setEndFrameVar(const std::string& endFrameVar) { _endFrameVar = endFrameVar; } void setTimeScaleVar(const std::string& timeScaleVar) { _timeScaleVar = timeScaleVar; } void setLoopFlagVar(const std::string& loopFlagVar) { _loopFlagVar = loopFlagVar; } void setFrameVar(const std::string& frameVar) { _frameVar = frameVar; } +protected: + void loadURL(const std::string& url); + virtual void setCurrentFrameInternal(float frame) override; float accumulateTime(float frame, float dt) const; diff --git a/libraries/animation/src/AnimNodeLoader.cpp b/libraries/animation/src/AnimNodeLoader.cpp index 615dde1627..74bafb8630 100644 --- a/libraries/animation/src/AnimNodeLoader.cpp +++ b/libraries/animation/src/AnimNodeLoader.cpp @@ -54,6 +54,13 @@ static NodeLoaderFunc nodeLoaderFuncs[AnimNode::NumTypes] = { } \ QString NAME = NAME##_VAL.toString() +#define READ_OPTIONAL_STRING(NAME, JSON_OBJ) \ + auto NAME##_VAL = JSON_OBJ.value(#NAME); \ + QString NAME; \ + if (NAME##_VAL.isString()) { \ + NAME = NAME##_VAL.toString(); \ + } + #define READ_BOOL(NAME, JSON_OBJ, ID, URL) \ auto NAME##_VAL = JSON_OBJ.value(#NAME); \ if (!NAME##_VAL.isBool()) { \ @@ -137,14 +144,42 @@ static AnimNode::Pointer loadClipNode(const QJsonObject& jsonObj, const QString& READ_FLOAT(timeScale, jsonObj, id, jsonUrl); READ_BOOL(loopFlag, jsonObj, id, jsonUrl); - return std::make_shared(id.toStdString(), url.toStdString(), startFrame, endFrame, timeScale, loopFlag); + READ_OPTIONAL_STRING(startFrameVar, jsonObj); + READ_OPTIONAL_STRING(endFrameVar, jsonObj); + READ_OPTIONAL_STRING(timeScaleVar, jsonObj); + READ_OPTIONAL_STRING(loopFlagVar, jsonObj); + + auto node = std::make_shared(id.toStdString(), url.toStdString(), startFrame, endFrame, timeScale, loopFlag); + + if (!startFrameVar.isEmpty()) { + node->setStartFrameVar(startFrameVar.toStdString()); + } + if (!endFrameVar.isEmpty()) { + node->setEndFrameVar(endFrameVar.toStdString()); + } + if (!timeScaleVar.isEmpty()) { + node->setTimeScaleVar(timeScaleVar.toStdString()); + } + if (!loopFlagVar.isEmpty()) { + node->setLoopFlagVar(loopFlagVar.toStdString()); + } + + return node; } static AnimNode::Pointer loadBlendLinearNode(const QJsonObject& jsonObj, const QString& id, const QUrl& jsonUrl) { READ_FLOAT(alpha, jsonObj, id, jsonUrl); - return std::make_shared(id.toStdString(), alpha); + READ_OPTIONAL_STRING(alphaVar, jsonObj); + + auto node = std::make_shared(id.toStdString(), alpha); + + if (!alphaVar.isEmpty()) { + node->setAlphaVar(alphaVar.toStdString()); + } + + return node; } static const char* boneSetStrings[AnimOverlay::NumBoneSets] = { @@ -172,6 +207,7 @@ static AnimOverlay::BoneSet stringToBoneSetEnum(const QString& str) { static AnimNode::Pointer loadOverlayNode(const QJsonObject& jsonObj, const QString& id, const QUrl& jsonUrl) { READ_STRING(boneSet, jsonObj, id, jsonUrl); + READ_FLOAT(alpha, jsonObj, id, jsonUrl); auto boneSetEnum = stringToBoneSetEnum(boneSet); if (boneSetEnum == AnimOverlay::NumBoneSets) { @@ -179,7 +215,19 @@ static AnimNode::Pointer loadOverlayNode(const QJsonObject& jsonObj, const QStri boneSetEnum = AnimOverlay::FullBodyBoneSet; } - return std::make_shared(id.toStdString(), boneSetEnum); + READ_OPTIONAL_STRING(boneSetVar, jsonObj); + READ_OPTIONAL_STRING(alphaVar, jsonObj); + + auto node = std::make_shared(id.toStdString(), boneSetEnum, alpha); + + if (!boneSetVar.isEmpty()) { + node->setBoneSetVar(boneSetVar.toStdString()); + } + if (!alphaVar.isEmpty()) { + node->setAlphaVar(alphaVar.toStdString()); + } + + return node; } AnimNodeLoader::AnimNodeLoader(const QUrl& url) : diff --git a/libraries/animation/src/AnimOverlay.h b/libraries/animation/src/AnimOverlay.h index 2fe25d430e..5940f0b2b3 100644 --- a/libraries/animation/src/AnimOverlay.h +++ b/libraries/animation/src/AnimOverlay.h @@ -21,7 +21,7 @@ class AnimOverlay : public AnimNode { public: - friend class AnimDebugDraw; + friend class AnimTests; enum BoneSet { FullBodyBoneSet = 0, @@ -42,12 +42,12 @@ public: virtual const AnimPoseVec& evaluate(const AnimVariantMap& animVars, float dt) override; - protected: - void buildBoneSet(BoneSet boneSet); - void setBoneSetVar(const std::string& boneSetVar) { _boneSetVar = boneSetVar; } void setAlphaVar(const std::string& alphaVar) { _alphaVar = alphaVar; } + protected: + void buildBoneSet(BoneSet boneSet); + // for AnimDebugDraw rendering virtual const AnimPoseVec& getPosesInternal() const override; virtual void setSkeletonInternal(AnimSkeleton::ConstPointer skeleton) override; diff --git a/tests/animation/src/data/avatar.json b/tests/animation/src/data/avatar.json index 5dca9d3e16..f19ac04d56 100644 --- a/tests/animation/src/data/avatar.json +++ b/tests/animation/src/data/avatar.json @@ -5,7 +5,8 @@ "type": "overlay", "data": { "boneSet": "upperBody", - "alpha": 1.0 + "alpha": 1.0, + "alphaVar": "sine" }, "children": [ {