summaryrefslogtreecommitdiffstats
path: root/tests/auto/viewer/tst_qt3dsviewer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tests/auto/viewer/tst_qt3dsviewer.cpp')
-rw-r--r--tests/auto/viewer/tst_qt3dsviewer.cpp182
1 files changed, 148 insertions, 34 deletions
diff --git a/tests/auto/viewer/tst_qt3dsviewer.cpp b/tests/auto/viewer/tst_qt3dsviewer.cpp
index f7d5e831..d3387678 100644
--- a/tests/auto/viewer/tst_qt3dsviewer.cpp
+++ b/tests/auto/viewer/tst_qt3dsviewer.cpp
@@ -34,6 +34,9 @@
#include <QtStudio3D/Q3DSElement>
#include <QtStudio3D/Q3DSViewerSettings>
#include <QtCore/QRandomGenerator>
+#include <QtCore/QFile>
+#include <QtCore/QTextStream>
+#include <QtCore/QRegularExpression>
void messageOutput(QtMsgType type, const QMessageLogContext &context,
const QString &msg)
@@ -98,6 +101,7 @@ void tst_qt3dsviewer::init()
void tst_qt3dsviewer::cleanup()
{
+ deleteCreatedElements(0);
m_viewer.hide();
}
@@ -165,7 +169,8 @@ void tst_qt3dsviewer::testSettings()
void tst_qt3dsviewer::testCreateElement()
{
- // Currently this method is very bare bones on actual testing.
+ // Currently this method is very bare bones on actual testing due to lack of programmatic
+ // feedback on dynamic object creation.
// It can be used to visually check if items are getting created.
m_viewer.show();
@@ -187,7 +192,7 @@ void tst_qt3dsviewer::testCreateElement()
QVariant::fromValue<QVector3D>(QVector3D(200, 300, 200)));
data.insert(QStringLiteral("opacity"), 20.0);
- m_presentation->createElement(QStringLiteral("Scene.Layer"), QStringLiteral("Slide1"), data);
+ createElement(QStringLiteral("Scene.Layer"), QStringLiteral("Slide1"), data);
// Elements can be registered before they are created
Q3DSElement newCylinder(m_presentation, QStringLiteral("Scene.Layer.New Cylinder"));
@@ -218,8 +223,8 @@ void tst_qt3dsviewer::testCreateElement()
data.insert(QStringLiteral("position"),
QVariant::fromValue<QVector3D>(QVector3D(50, animValue, 50)));
- m_presentation->createElement(QStringLiteral("Scene.Layer.New Cylinder"),
- QStringLiteral("Slide1"), data);
+ createElement(QStringLiteral("Scene.Layer.New Cylinder"),
+ QStringLiteral("Slide1"), data);
data.clear();
data.insert(QStringLiteral("name"), QStringLiteral("New Sphere"));
@@ -230,8 +235,7 @@ void tst_qt3dsviewer::testCreateElement()
data.insert(QStringLiteral("position"),
QVariant::fromValue<QVector3D>(QVector3D(animValue, 75, 0)));
- m_presentation->createElement(QStringLiteral("Scene.Layer.Cube2"),
- QStringLiteral("Slide2"), data);
+ createElement(QStringLiteral("Scene.Layer.Cube2"), QStringLiteral("Slide2"), data);
data.clear();
data.insert(QStringLiteral("name"), QStringLiteral("Sphere To Delete"));
@@ -242,8 +246,7 @@ void tst_qt3dsviewer::testCreateElement()
data.insert(QStringLiteral("position"),
QVariant::fromValue<QVector3D>(QVector3D(-100, -100, 0)));
- m_presentation->createElement(QStringLiteral("Scene.Layer"),
- QStringLiteral("Slide2"), data);
+ createElement(QStringLiteral("Scene.Layer"), QStringLiteral("Slide2"), data);
animationTimer.start();
});
@@ -254,6 +257,8 @@ void tst_qt3dsviewer::testCreateElement()
// Remove dynamically added object
QTimer::singleShot(3000, [&]() {
m_presentation->deleteElement(QStringLiteral("Scene.Layer.Sphere To Delete"));
+ // Don't remove the deleted element from createdElements to test removing already deleted
+ // element later when everything is cleaned up.
});
// Create objects to slides 1 and 2 while slide 2 is executing
@@ -267,8 +272,7 @@ void tst_qt3dsviewer::testCreateElement()
data.insert(QStringLiteral("position"),
QVariant::fromValue<QVector3D>(QVector3D(-100, -100, 0)));
- m_presentation->createElement(QStringLiteral("Scene.Layer"), QStringLiteral("Slide1"),
- data);
+ createElement(QStringLiteral("Scene.Layer"), QStringLiteral("Slide1"), data);
data.clear();
data.insert(QStringLiteral("name"), QStringLiteral("New Sphere 2"));
@@ -279,8 +283,7 @@ void tst_qt3dsviewer::testCreateElement()
data.insert(QStringLiteral("position"),
QVariant::fromValue<QVector3D>(QVector3D(-100, 100, 0)));
- m_presentation->createElement(QStringLiteral("Scene.Layer"), QStringLiteral("Slide2"),
- data);
+ createElement(QStringLiteral("Scene.Layer"), QStringLiteral("Slide2"), data);
});
// Switch to slide 1
@@ -290,16 +293,14 @@ void tst_qt3dsviewer::testCreateElement()
createTimer.setInterval(0);
static int elemCounter = 0;
QRandomGenerator rnd;
- QStringList massModels;
- auto createModelsConnection = QObject::connect(&createTimer, &QTimer::timeout, [&]() {
- // Create a bunch of models to slide 2 in small batches to avoid slowdown
+ auto createElementsConnection = QObject::connect(&createTimer, &QTimer::timeout, [&]() {
+ // Create a bunch of elements to slide 2 in small batches to avoid slowdown
for (int i = 0; i < 5; ++i) {
++elemCounter;
data.clear();
- QString modelName = QStringLiteral("MassModel_%1").arg(elemCounter);
- massModels << QStringLiteral("Scene.Layer.") + modelName;
- data.insert(QStringLiteral("name"), modelName);
+ QString elementName = QStringLiteral("MassElement_%1").arg(elemCounter);
+ data.insert(QStringLiteral("name"), elementName);
data.insert(QStringLiteral("sourcepath"),
elemCounter % 2 ? QStringLiteral("#Cube") : QStringLiteral("#Cone"));
data.insert(QStringLiteral("material"),
@@ -310,39 +311,152 @@ void tst_qt3dsviewer::testCreateElement()
rnd.bounded(-600, 600),
rnd.bounded(800, 1200))));
- m_presentation->createElement(QStringLiteral("Scene.Layer"), QStringLiteral("Slide2"),
- data);
+ createElement(QStringLiteral("Scene.Layer"), QStringLiteral("Slide2"), data);
}
if (elemCounter >= 1000) {
- qDebug() << "Extra models created:" << elemCounter;
+ qDebug() << "Extra elements created:" << elemCounter;
createTimer.stop();
}
});
- qDebug() << "Start creating extra models";
+ qDebug() << "Start creating extra elements";
createTimer.start();
// Switch to slide 2
QVERIFY(spyExited.wait(20000));
- QObject::disconnect(createModelsConnection);
+ QObject::disconnect(createElementsConnection);
QTest::qWait(500);
- elemCounter = massModels.size() - 1;
- QObject::connect(&createTimer, &QTimer::timeout, [&]() {
- // Delete all models we created previously
+ deleteCreatedElements(1);
+
+ // Switch to slide 1
+ QVERIFY(spyExited.wait(20000));
+ QTest::qWait(1000);
+}
+
+void tst_qt3dsviewer::testCreateMaterial()
+{
+ m_viewer.show();
+
+ m_settings->setShowRenderStats(true);
+ m_settings->setScaleMode(Q3DSViewerSettings::ScaleModeFill);
+
+ QSignalSpy spyExited(m_presentation,
+ SIGNAL(slideExited(const QString &, unsigned int, const QString &)));
+ QSignalSpy spyMatCreated(m_presentation, SIGNAL(materialCreated(const QString &)));
+
+ // Create material via .materialdef file in resources
+ m_presentation->createMaterial(
+ QStringLiteral("Scene"),
+ QStringLiteral(
+ ":/scenes/simple_cube_animation/materials/Basic Blue.materialdef"));
+ m_presentation->createMaterial(
+ QStringLiteral("Scene"),
+ QStringLiteral(
+ ":/scenes/simple_cube_animation/materials/Basic Texture.materialdef"));
+
+ // Create material directly from materialdef content
+ auto loadMatDefFile = [&](const QString &fileName) -> QString {
+ QFile matDefFile(fileName);
+ if (!matDefFile.open(QIODevice::ReadOnly | QIODevice::Text))
+ return {};
+
+ QTextStream in(&matDefFile);
+ return in.readAll();
+ };
+ QString matDef = loadMatDefFile(
+ QStringLiteral(":/scenes/simple_cube_animation/materials/Copper.materialdef"));
+ QVERIFY(!matDef.isEmpty());
+
+ m_presentation->createMaterial(QStringLiteral("Scene"), matDef);
+
+ QObject::connect(m_presentation, &Q3DSPresentation::materialCreated,
+ [this](const QString &name) {
+ QHash<QString, QVariant> data;
+
+ if (name == QStringLiteral("materials/Basic Blue")) {
+ data.insert(QStringLiteral("name"), QStringLiteral("Blue Cylinder"));
+ data.insert(QStringLiteral("sourcepath"), QStringLiteral("#Cylinder"));
+ data.insert(QStringLiteral("material"), name);
+ data.insert(QStringLiteral("position"),
+ QVariant::fromValue<QVector3D>(QVector3D(200, 300, 200)));
+ createElement(QStringLiteral("Scene.Layer"), QStringLiteral("Slide1"), data);
+ }
+
+ if (name == QStringLiteral("materials/Basic Texture")) {
+ data.insert(QStringLiteral("name"), QStringLiteral("Textured Cone"));
+ data.insert(QStringLiteral("sourcepath"), QStringLiteral("#Cone"));
+ data.insert(QStringLiteral("material"), name);
+ data.insert(QStringLiteral("position"),
+ QVariant::fromValue<QVector3D>(QVector3D(-200, -300, 200)));
+ createElement(QStringLiteral("Scene.Layer"), QStringLiteral("Slide1"), data);
+ }
+
+ if (name == QStringLiteral("materials/Copper")) {
+ data.insert(QStringLiteral("name"), QStringLiteral("Copper Sphere"));
+ data.insert(QStringLiteral("sourcepath"), QStringLiteral("#Sphere"));
+ data.insert(QStringLiteral("material"), name);
+ data.insert(QStringLiteral("position"),
+ QVariant::fromValue<QVector3D>(QVector3D(-200, 300, 200)));
+ createElement(QStringLiteral("Scene.Layer"), QStringLiteral("Slide1"), data);
+ }
+
+ if (name == QStringLiteral("materials/Just Yellow")) {
+ QHash<QString, QVariant> data;
+ data.insert(QStringLiteral("name"), QStringLiteral("Yellow Cube"));
+ data.insert(QStringLiteral("sourcepath"), QStringLiteral("#Cube"));
+ data.insert(QStringLiteral("material"), name);
+ data.insert(QStringLiteral("position"),
+ QVariant::fromValue<QVector3D>(QVector3D(200, -300, 200)));
+ createElement(QStringLiteral("Scene.Layer"), QStringLiteral("Slide1"), data);
+ }
+ });
+
+ // Create material after start
+ QTimer::singleShot(1000, [&]() {
+ QString md = loadMatDefFile(QStringLiteral(
+ ":/scenes/simple_cube_animation/materials/Basic Blue.materialdef"));
+ // Modify the diffuse color and material name so that we can be sure it is a new one
+ md.replace(QStringLiteral("Basic Blue"), QStringLiteral("Just Yellow"));
+ md.replace(QRegularExpression(QStringLiteral("\"diffuse\">.*<")),
+ QStringLiteral("\"diffuse\">1 1 0 1<"));
+ m_presentation->createMaterial(QStringLiteral("Scene"), md);
+ });
+
+ QVERIFY(spyExited.wait(20000));
+ QCOMPARE(spyMatCreated.count(), 4);
+ QTest::qWait(200); // Extra wait to verify slide change visually
+}
+
+void tst_qt3dsviewer::deleteCreatedElements(int interval)
+{
+ QTimer deleteTimer;
+ deleteTimer.setInterval(interval);
+ int elemCounter = m_createdElements.size() - 1;
+ QObject::connect(&deleteTimer, &QTimer::timeout, [&]() {
+ // Delete all elements we created previously
if (elemCounter >= 0) {
- m_presentation->deleteElement(massModels[elemCounter]);
+ m_presentation->deleteElement(m_createdElements[elemCounter]);
--elemCounter;
} else {
- qDebug() << "Extra models deleted";
- createTimer.stop();
+ qDebug() << "Extra elements deleted";
+ deleteTimer.stop();
}
});
- qDebug() << "Start deleting extra models";
- createTimer.setInterval(1);
- createTimer.start();
+ qDebug() << "Start deleting extra elements";
+ deleteTimer.start();
- // Switch to slide 1
- QVERIFY(spyExited.wait(20000));
+ while (deleteTimer.isActive())
+ QTest::qWait(20);
+
+ m_createdElements.clear();
+}
+
+void tst_qt3dsviewer::createElement(const QString &parentElementPath, const QString &slideName,
+ const QHash<QString, QVariant> &properties)
+{
+ m_createdElements << parentElementPath + QLatin1Char('.')
+ + properties[QStringLiteral("name")].toString();
+ m_presentation->createElement(parentElementPath, slideName, properties);
}
QTEST_MAIN(tst_qt3dsviewer)