From 62f86e6a462cbba67cf7c70760c3af361ebcf460 Mon Sep 17 00:00:00 2001 From: "Anthony J. Thibault" Date: Tue, 25 Aug 2015 11:33:57 -0700 Subject: [PATCH] Added AnimVariant, renamed AnimClipTests to AnimTests. * Added test for AnimVariant. --- libraries/animation/src/AnimClip.h | 2 +- libraries/animation/src/AnimVariant.h | 63 +++++++++ .../src/{AnimClipTests.cpp => AnimTests.cpp} | 133 +++++++++++------- .../src/{AnimClipTests.h => AnimTests.h} | 13 +- 4 files changed, 156 insertions(+), 55 deletions(-) create mode 100644 libraries/animation/src/AnimVariant.h rename tests/animation/src/{AnimClipTests.cpp => AnimTests.cpp} (53%) rename tests/animation/src/{AnimClipTests.h => AnimTests.h} (65%) diff --git a/libraries/animation/src/AnimClip.h b/libraries/animation/src/AnimClip.h index 3480fdc3cf..2cce40d98a 100644 --- a/libraries/animation/src/AnimClip.h +++ b/libraries/animation/src/AnimClip.h @@ -22,7 +22,7 @@ class AnimClip : public AnimNode { public: - friend class AnimClipTests; + friend class AnimTests; AnimClip(const std::string& id, const std::string& url, float startFrame, float endFrame, float timeScale, bool loopFlag); virtual ~AnimClip() override; diff --git a/libraries/animation/src/AnimVariant.h b/libraries/animation/src/AnimVariant.h new file mode 100644 index 0000000000..13e364045b --- /dev/null +++ b/libraries/animation/src/AnimVariant.h @@ -0,0 +1,63 @@ +// +// AnimVariant.h +// +// Copyright 2015 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#ifndef hifi_AnimVariant_h +#define hifi_AnimVariant_h + +#include +#include +#include + +class AnimVariant { +public: + enum Type { + BoolType = 0, + FloatType, + Vec3Type, + QuatType, + Mat4Type, + NumTypes + }; + + AnimVariant() : _type(BoolType) { memset(&_val, 0, sizeof(_val)); } + AnimVariant(bool value) : _type(BoolType) { _val.boolVal = value; } + AnimVariant(float value) : _type(FloatType) { _val.floats[0] = value; } + AnimVariant(const glm::vec3& value) : _type(Vec3Type) { *reinterpret_cast(&_val) = value; } + AnimVariant(const glm::quat& value) : _type(QuatType) { *reinterpret_cast(&_val) = value; } + AnimVariant(const glm::mat4& value) : _type(Mat4Type) { *reinterpret_cast(&_val) = value; } + + bool isBool() const { return _type == BoolType; } + bool isFloat() const { return _type == FloatType; } + bool isVec3() const { return _type == Vec3Type; } + bool isQuat() const { return _type == QuatType; } + bool isMat4() const { return _type == Mat4Type; } + + void setBool(bool value) { assert(_type == BoolType); _val.boolVal = value; } + void setFloat(float value) { assert(_type == FloatType); _val.floats[0] = value; } + void setVec3(const glm::vec3& value) { assert(_type == Vec3Type); *reinterpret_cast(&_val) = value; } + void setQuat(const glm::quat& value) { assert(_type == QuatType); *reinterpret_cast(&_val) = value; } + void setMat4(const glm::mat4& value) { assert(_type == Mat4Type); *reinterpret_cast(&_val) = value; } + + bool getBool() { assert(_type == BoolType); return _val.boolVal; } + float getFloat() { assert(_type == FloatType); return _val.floats[0]; } + const glm::vec3& getVec3() { assert(_type == Vec3Type); return *reinterpret_cast(&_val); } + const glm::quat& getQuat() { assert(_type == QuatType); return *reinterpret_cast(&_val); } + const glm::mat4& getMat4() { assert(_type == Mat4Type); return *reinterpret_cast(&_val); } + +protected: + Type _type; + union { + bool boolVal; + float floats[16]; + } _val; +}; + +typedef std::map AnimVarantMap; + +#endif // hifi_AnimVariant_h diff --git a/tests/animation/src/AnimClipTests.cpp b/tests/animation/src/AnimTests.cpp similarity index 53% rename from tests/animation/src/AnimClipTests.cpp rename to tests/animation/src/AnimTests.cpp index 9a7841947b..82d805d515 100644 --- a/tests/animation/src/AnimClipTests.cpp +++ b/tests/animation/src/AnimTests.cpp @@ -1,5 +1,5 @@ // -// AnimClipTests.cpp +// AnimTests.cpp // // Copyright 2015 High Fidelity, Inc. // @@ -7,28 +7,29 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -#include "AnimClipTests.h" +#include "AnimTests.h" #include "AnimNodeLoader.h" #include "AnimClip.h" #include "AnimBlendLinear.h" #include "AnimationLogging.h" +#include "AnimVariant.h" #include <../QTestExtensions.h> -QTEST_MAIN(AnimClipTests) +QTEST_MAIN(AnimTests) const float EPSILON = 0.001f; -void AnimClipTests::initTestCase() { +void AnimTests::initTestCase() { auto animationCache = DependencyManager::set(); auto resourceCacheSharedItems = DependencyManager::set(); } -void AnimClipTests::cleanupTestCase() { +void AnimTests::cleanupTestCase() { DependencyManager::destroy(); } -void AnimClipTests::testAccessors() { +void AnimTests::testAccessors() { std::string id = "my anim clip"; std::string url = "https://hifi-public.s3.amazonaws.com/ozan/support/FightClubBotTest1/Animations/standard_idle.fbx"; float startFrame = 2.0f; @@ -71,7 +72,7 @@ static float framesToSec(float secs) { return secs / FRAMES_PER_SECOND; } -void AnimClipTests::testEvaulate() { +void AnimTests::testEvaulate() { std::string id = "my clip node"; std::string url = "https://hifi-public.s3.amazonaws.com/ozan/support/FightClubBotTest1/Animations/standard_idle.fbx"; float startFrame = 2.0f; @@ -94,7 +95,7 @@ void AnimClipTests::testEvaulate() { QCOMPARE_WITH_ABS_ERROR(clip._frame, 22.0f, EPSILON); } -void AnimClipTests::testLoader() { +void AnimTests::testLoader() { auto url = QUrl("https://gist.githubusercontent.com/hyperlogic/857129fe04567cbe670f/raw/8ba57a8f0a76f88b39a11f77f8d9df04af9cec95/test.json"); AnimNodeLoader loader(url); @@ -104,45 +105,8 @@ void AnimClipTests::testLoader() { timer.setInterval(timeout); timer.setSingleShot(true); - bool done = false; - connect(&loader, &AnimNodeLoader::success, [&](AnimNode::Pointer node) { - QVERIFY((bool)node); - QVERIFY(node->getID() == "blend"); - QVERIFY(node->getType() == AnimNode::BlendLinearType); - - QVERIFY((bool)node); - QVERIFY(node->getID() == "blend"); - QVERIFY(node->getType() == AnimNode::BlendLinearType); - - auto blend = std::static_pointer_cast(node); - QVERIFY(blend->getAlpha() == 0.5f); - - QVERIFY(node->getChildCount() == 3); - - std::shared_ptr nodes[3] = { node->getChild(0), node->getChild(1), node->getChild(2) }; - - QVERIFY(nodes[0]->getID() == "test01"); - QVERIFY(nodes[0]->getChildCount() == 0); - QVERIFY(nodes[1]->getID() == "test02"); - QVERIFY(nodes[1]->getChildCount() == 0); - QVERIFY(nodes[2]->getID() == "test03"); - QVERIFY(nodes[2]->getChildCount() == 0); - - auto test01 = std::static_pointer_cast(nodes[0]); - QVERIFY(test01->getURL() == "test01.fbx"); - QVERIFY(test01->getStartFrame() == 1.0f); - QVERIFY(test01->getEndFrame() == 20.0f); - QVERIFY(test01->getTimeScale() == 1.0f); - QVERIFY(test01->getLoopFlag() == false); - - auto test02 = std::static_pointer_cast(nodes[1]); - QVERIFY(test02->getURL() == "test02.fbx"); - QVERIFY(test02->getStartFrame() == 2.0f); - QVERIFY(test02->getEndFrame() == 21.0f); - QVERIFY(test02->getTimeScale() == 0.9f); - QVERIFY(test02->getLoopFlag() == true); - done = true; - }); + AnimNode::Pointer node = nullptr; + connect(&loader, &AnimNodeLoader::success, [&](AnimNode::Pointer nodeIn) { node = nodeIn; }); loop.connect(&loader, SIGNAL(success(AnimNode::Pointer)), SLOT(quit())); loop.connect(&loader, SIGNAL(error(int, QString)), SLOT(quit())); @@ -150,5 +114,78 @@ void AnimClipTests::testLoader() { timer.start(); loop.exec(); - QVERIFY(done); + QVERIFY((bool)node); + + QVERIFY(node->getID() == "blend"); + QVERIFY(node->getType() == AnimNode::BlendLinearType); + + QVERIFY((bool)node); + QVERIFY(node->getID() == "blend"); + QVERIFY(node->getType() == AnimNode::BlendLinearType); + + auto blend = std::static_pointer_cast(node); + QVERIFY(blend->getAlpha() == 0.5f); + + QVERIFY(node->getChildCount() == 3); + + std::shared_ptr nodes[3] = { node->getChild(0), node->getChild(1), node->getChild(2) }; + + QVERIFY(nodes[0]->getID() == "test01"); + QVERIFY(nodes[0]->getChildCount() == 0); + QVERIFY(nodes[1]->getID() == "test02"); + QVERIFY(nodes[1]->getChildCount() == 0); + QVERIFY(nodes[2]->getID() == "test03"); + QVERIFY(nodes[2]->getChildCount() == 0); + + auto test01 = std::static_pointer_cast(nodes[0]); + QVERIFY(test01->getURL() == "test01.fbx"); + QVERIFY(test01->getStartFrame() == 1.0f); + QVERIFY(test01->getEndFrame() == 20.0f); + QVERIFY(test01->getTimeScale() == 1.0f); + QVERIFY(test01->getLoopFlag() == false); + + auto test02 = std::static_pointer_cast(nodes[1]); + QVERIFY(test02->getURL() == "test02.fbx"); + QVERIFY(test02->getStartFrame() == 2.0f); + QVERIFY(test02->getEndFrame() == 21.0f); + QVERIFY(test02->getTimeScale() == 0.9f); + QVERIFY(test02->getLoopFlag() == true); +} + +void AnimTests::testVariant() { + auto defaultVar = AnimVariant(); + auto boolVar = AnimVariant(true); + auto floatVar = AnimVariant(1.0f); + auto vec3Var = AnimVariant(glm::vec3(1.0f, 2.0f, 3.0f)); + auto quatVar = AnimVariant(glm::quat(1.0f, 2.0f, 3.0f, 4.0f)); + auto mat4Var = AnimVariant(glm::mat4(glm::vec4(1.0f, 2.0f, 3.0f, 4.0f), + glm::vec4(5.0f, 6.0f, 7.0f, 8.0f), + glm::vec4(9.0f, 10.0f, 11.0f, 12.0f), + glm::vec4(13.0f, 14.0f, 15.0f, 16.0f))); + QVERIFY(defaultVar.isBool()); + QVERIFY(defaultVar.getBool() == false); + + QVERIFY(boolVar.isBool()); + QVERIFY(boolVar.getBool() == true); + + QVERIFY(floatVar.isFloat()); + QVERIFY(floatVar.getFloat() == 1.0f); + + QVERIFY(vec3Var.isVec3()); + auto v = vec3Var.getVec3(); + QVERIFY(v.x == 1.0f); + QVERIFY(v.y == 2.0f); + QVERIFY(v.z == 3.0f); + + QVERIFY(quatVar.isQuat()); + auto q = quatVar.getQuat(); + QVERIFY(q.w == 1.0f); + QVERIFY(q.x == 2.0f); + QVERIFY(q.y == 3.0f); + QVERIFY(q.z == 4.0f); + + QVERIFY(mat4Var.isMat4()); + auto m = mat4Var.getMat4(); + QVERIFY(m[0].x == 1.0f); + QVERIFY(m[3].w == 16.0f); } diff --git a/tests/animation/src/AnimClipTests.h b/tests/animation/src/AnimTests.h similarity index 65% rename from tests/animation/src/AnimClipTests.h rename to tests/animation/src/AnimTests.h index 6239a88be8..460caa067d 100644 --- a/tests/animation/src/AnimClipTests.h +++ b/tests/animation/src/AnimTests.h @@ -1,19 +1,19 @@ // -// AnimClipTests.h +// AnimTests.h // -// Copyright 2015 High Fidelity, Inc. +// Copyright 2015 High Fidelity, Inc. // // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -#ifndef hifi_AnimClipTests_h -#define hifi_AnimClipTests_h +#ifndef hifi_AnimTests_h +#define hifi_AnimTests_h #include #include -class AnimClipTests : public QObject { +class AnimTests : public QObject { Q_OBJECT private slots: void initTestCase(); @@ -21,6 +21,7 @@ private slots: void testAccessors(); void testEvaulate(); void testLoader(); + void testVariant(); }; -#endif // hifi_AnimClipTests_h +#endif // hifi_AnimTests_h