// Copyright (C) 2017 Klaralvdalens Datakonsult AB (KDAB). // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 #include #include #include #include #include #include #include #include #include #include #include #include using namespace Qt3DCore; using namespace Qt3DRender; using namespace Qt3DRender::Render; Q_DECLARE_METATYPE(Qt3DRender::Render::JointInfo) Q_DECLARE_METATYPE(Qt3DRender::Render::SkeletonData) Q_DECLARE_METATYPE(Qt3DCore::Sqt) class tst_Skeleton : public Qt3DCore::QBackendNodeTester { Q_OBJECT private Q_SLOTS: void checkPeerPropertyMirroring() { // GIVEN TestRenderer renderer; NodeManagers nodeManagers; renderer.setNodeManagers(&nodeManagers); Skeleton backendSkeleton; backendSkeleton.setRenderer(&renderer); backendSkeleton.setSkeletonManager(nodeManagers.skeletonManager()); QSkeletonLoader skeleton; skeleton.setSource(QUrl::fromLocalFile("funnybones.json")); // WHEN simulateInitializationSync(&skeleton, &backendSkeleton); // THEN QCOMPARE(backendSkeleton.peerId(), skeleton.id()); QCOMPARE(backendSkeleton.isEnabled(), skeleton.isEnabled()); QCOMPARE(backendSkeleton.source(), skeleton.source()); QCOMPARE(backendSkeleton.rootJointId(), QNodeId()); // GIVEN Skeleton backendSkeleton2; backendSkeleton2.setRenderer(&renderer); backendSkeleton2.setSkeletonManager(nodeManagers.skeletonManager()); QSkeleton skeleton2; QJoint *joint = new QJoint(); skeleton2.setRootJoint(joint); // WHEN simulateInitializationSync(&skeleton2, &backendSkeleton2); // THEN QCOMPARE(backendSkeleton2.peerId(), skeleton2.id()); QCOMPARE(backendSkeleton2.isEnabled(), skeleton2.isEnabled()); QCOMPARE(backendSkeleton2.source(), QUrl()); QCOMPARE(backendSkeleton2.rootJointId(), joint->id()); } void checkInitialAndCleanedUpState() { // GIVEN TestRenderer renderer; NodeManagers nodeManagers; renderer.setNodeManagers(&nodeManagers); Skeleton backendSkeleton; backendSkeleton.setRenderer(&renderer); backendSkeleton.setSkeletonManager(nodeManagers.skeletonManager()); // THEN QVERIFY(backendSkeleton.peerId().isNull()); QCOMPARE(backendSkeleton.isEnabled(), false); QCOMPARE(backendSkeleton.source(), QUrl()); QCOMPARE(backendSkeleton.status(), QSkeletonLoader::NotReady); QCOMPARE(backendSkeleton.rootJointId(), QNodeId()); // GIVEN QSkeletonLoader skeleton; skeleton.setSource(QUrl::fromLocalFile("skeleton1.json")); // WHEN simulateInitializationSync(&skeleton, &backendSkeleton); backendSkeleton.cleanup(); // THEN QCOMPARE(backendSkeleton.source(), QUrl()); QCOMPARE(backendSkeleton.isEnabled(), false); QCOMPARE(backendSkeleton.status(), QSkeletonLoader::NotReady); QCOMPARE(backendSkeleton.rootJointId(), QNodeId()); } void checkDirectPropertyChanges() { // GIVEN TestRenderer renderer; NodeManagers nodeManagers; renderer.setNodeManagers(&nodeManagers); Skeleton backendSkeleton; backendSkeleton.setRenderer(&renderer); backendSkeleton.setSkeletonManager(nodeManagers.skeletonManager()); backendSkeleton.setDataType(Skeleton::File); // Initialize to ensure skeleton manager is set QSkeletonLoader skeleton; skeleton.setSource(QUrl::fromLocalFile("skeleton1.json")); simulateInitializationSync(&skeleton, &backendSkeleton); // WHEN skeleton.setEnabled(false); backendSkeleton.syncFromFrontEnd(&skeleton, false); // THEN QCOMPARE(backendSkeleton.isEnabled(), false); // WHEN const QUrl newSource = QUrl::fromLocalFile("terminator.json"); skeleton.setSource(newSource); backendSkeleton.syncFromFrontEnd(&skeleton, false); // THEN QCOMPARE(backendSkeleton.source(), newSource); } void checkCreateFrontendJoint_data() { QTest::addColumn("inverseBindMatrix"); QTest::addColumn("localPose"); QTest::addColumn("jointName"); QTest::addColumn("expectedJoint"); QMatrix4x4 m; Qt3DCore::Sqt localPose; QTest::newRow("default") << m << localPose << QString() << new QJoint(); const QVector3D t(1.0f, 2.0f, 3.0f); const QQuaternion r = QQuaternion::fromAxisAndAngle(1.0f, 0.0f, 0.0f, 45.0f); const QVector3D s(1.5f, 2.5f, 3.5f); localPose.scale = s; localPose.rotation = r; localPose.translation = t; QString name = QLatin1String("Foo"); QJoint *joint = new QJoint(); joint->setTranslation(t); joint->setRotation(r); joint->setScale(s); joint->setName(name); joint->setInverseBindMatrix(m); QTest::newRow("localPose") << m << localPose << name << joint; m.rotate(r); m.scale(QVector3D(1.0f, 1.0f, 1.0f) / s); m.translate(-t); name = QLatin1String("Bar"); joint = new QJoint(); joint->setTranslation(t); joint->setRotation(r); joint->setScale(s); joint->setInverseBindMatrix(m); joint->setName(name); QTest::newRow("inverseBind") << m << localPose << name << joint; } }; QTEST_APPLESS_MAIN(tst_Skeleton) #include "tst_skeleton.moc"