From 28777a99f79bc9db1a28e1b93080b005be03353b Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Wed, 3 Sep 2014 13:37:31 +0300 Subject: Allow setting volume subtexture along any axis Change-Id: Iafaac6bd2106253bec913d1d9ee8a3f40e339adf Reviewed-by: Mika Salmela --- tests/volumetrictest/logo_no_padding.png | Bin 0 -> 2278 bytes tests/volumetrictest/main.cpp | 10 ++++- tests/volumetrictest/volumetrictest.cpp | 74 ++++++++++++++++++++++++++++--- tests/volumetrictest/volumetrictest.h | 3 ++ tests/volumetrictest/volumetrictest.qrc | 1 + 5 files changed, 80 insertions(+), 8 deletions(-) create mode 100644 tests/volumetrictest/logo_no_padding.png (limited to 'tests') diff --git a/tests/volumetrictest/logo_no_padding.png b/tests/volumetrictest/logo_no_padding.png new file mode 100644 index 00000000..714234aa Binary files /dev/null and b/tests/volumetrictest/logo_no_padding.png differ diff --git a/tests/volumetrictest/main.cpp b/tests/volumetrictest/main.cpp index e838c43a..ba5ba6d3 100644 --- a/tests/volumetrictest/main.cpp +++ b/tests/volumetrictest/main.cpp @@ -26,6 +26,7 @@ #include #include #include +#include #include int main(int argc, char **argv) @@ -93,6 +94,9 @@ int main(int argc, char **argv) sliceImageYLabel->setScaledContents(true); sliceImageZLabel->setScaledContents(true); + QPushButton *testSubTextureSetting = new QPushButton(widget); + testSubTextureSetting->setText(QStringLiteral("Test subtexture settings")); + vLayout->addWidget(fpsLabel); vLayout->addWidget(sliceXCheckBox); vLayout->addWidget(sliceXSlider); @@ -102,8 +106,8 @@ int main(int argc, char **argv) vLayout->addWidget(sliceImageYLabel); vLayout->addWidget(sliceZCheckBox); vLayout->addWidget(sliceZSlider); - vLayout->addWidget(sliceImageZLabel, 1, Qt::AlignTop); - + vLayout->addWidget(sliceImageZLabel); + vLayout->addWidget(testSubTextureSetting, 1, Qt::AlignTop); VolumetricModifier *modifier = new VolumetricModifier(graph); modifier->setFpsLabel(fpsLabel); @@ -121,6 +125,8 @@ int main(int argc, char **argv) &VolumetricModifier::adjustSliceY); QObject::connect(sliceZSlider, &QSlider::valueChanged, modifier, &VolumetricModifier::adjustSliceZ); + QObject::connect(testSubTextureSetting, &QPushButton::clicked, modifier, + &VolumetricModifier::testSubtextureSetting); widget->show(); return app.exec(); diff --git a/tests/volumetrictest/volumetrictest.cpp b/tests/volumetrictest/volumetrictest.cpp index 53b0a875..555cc286 100644 --- a/tests/volumetrictest/volumetrictest.cpp +++ b/tests/volumetrictest/volumetrictest.cpp @@ -168,7 +168,67 @@ void VolumetricModifier::handleFpsChange() // const QString sceneDimensionsFormat = QStringLiteral("%1 x %2"); // m_fpsLabel->setText(sceneDimensionsFormat // .arg(m_graph->scene()->viewport().width()) -// .arg(m_graph->scene()->viewport().height())); + // .arg(m_graph->scene()->viewport().height())); +} + +void VolumetricModifier::testSubtextureSetting() +{ + // Setting the rendered Slice as subtexture should result in identical volume + QVector dataBefore = *m_volumeItem->textureData(); + dataBefore[0] = dataBefore.at(0); // Make sure we are detached + + checkRenderCase(1, Qt::XAxis, 56, dataBefore, m_volumeItem); + checkRenderCase(2, Qt::YAxis, 64, dataBefore, m_volumeItem); + checkRenderCase(3, Qt::ZAxis, 87, dataBefore, m_volumeItem); + + checkRenderCase(4, Qt::XAxis, 0, dataBefore, m_volumeItem); + checkRenderCase(5, Qt::YAxis, 0, dataBefore, m_volumeItem); + checkRenderCase(6, Qt::ZAxis, 0, dataBefore, m_volumeItem); + + checkRenderCase(7, Qt::XAxis, m_volumeItem->textureWidth() - 1, dataBefore, m_volumeItem); + checkRenderCase(8, Qt::YAxis, m_volumeItem->textureHeight() - 1, dataBefore, m_volumeItem); + checkRenderCase(9, Qt::ZAxis, m_volumeItem->textureDepth() - 1, dataBefore, m_volumeItem); + + dataBefore = *m_volumeItem2->textureData(); + dataBefore[0] = dataBefore.at(0); // Make sure we are detached + + checkRenderCase(11, Qt::XAxis, 56, dataBefore, m_volumeItem2); + checkRenderCase(12, Qt::YAxis, 64, dataBefore, m_volumeItem2); + checkRenderCase(13, Qt::ZAxis, 87, dataBefore, m_volumeItem2); + + checkRenderCase(14, Qt::XAxis, 0, dataBefore, m_volumeItem2); + checkRenderCase(15, Qt::YAxis, 0, dataBefore, m_volumeItem2); + checkRenderCase(16, Qt::ZAxis, 0, dataBefore, m_volumeItem2); + + checkRenderCase(17, Qt::XAxis, m_volumeItem2->textureWidth() - 1, dataBefore, m_volumeItem2); + checkRenderCase(18, Qt::YAxis, m_volumeItem2->textureHeight() - 1, dataBefore, m_volumeItem2); + checkRenderCase(19, Qt::ZAxis, m_volumeItem2->textureDepth() - 1, dataBefore, m_volumeItem2); + + // Do some visible swaps on volume 3 + QImage slice = m_volumeItem3->renderSlice(Qt::XAxis, 144); + slice = slice.mirrored(); + m_volumeItem3->setSubTextureData(Qt::XAxis, 144, slice); + + slice = m_volumeItem3->renderSlice(Qt::YAxis, 80); + slice = slice.mirrored(); + m_volumeItem3->setSubTextureData(Qt::YAxis, 80, slice); + + slice = m_volumeItem3->renderSlice(Qt::ZAxis, 190); + slice = slice.mirrored(true, false); + m_volumeItem3->setSubTextureData(Qt::ZAxis, 190, slice); +} + +void VolumetricModifier::checkRenderCase(int id, Qt::Axis axis, int index, + const QVector &dataBefore, + QCustom3DVolume *volumeItem) +{ + QImage slice = volumeItem->renderSlice(axis, index); + volumeItem->setSubTextureData(axis, index, slice); + + if (dataBefore == *volumeItem->textureData()) + qDebug() << __FUNCTION__ << "Case:" << id << "Vectors identical"; + else + qDebug() << __FUNCTION__ << "Case:" << id << "BUG: VECTORS DIFFER!"; } void VolumetricModifier::createVolume() @@ -179,7 +239,8 @@ void VolumetricModifier::createVolume() m_volumeItem->setPosition(QVector3D(-0.5f, 0.6f, 0.0f)); QImage logo; - logo.load(QStringLiteral(":/logo.png")); + logo.load(QStringLiteral(":/logo_no_padding.png")); + //logo.load(QStringLiteral(":/logo.png")); qDebug() << "image dimensions:" << logo.width() << logo.height() << logo.byteCount() << (logo.width() * logo.height()) << logo.bytesPerLine(); @@ -233,7 +294,7 @@ void VolumetricModifier::createVolume() // Change one picture using subtexture replacement QImage flipped = logo.mirrored(); - m_volumeItem->setSubTextureData(100, flipped); + m_volumeItem->setSubTextureData(Qt::ZAxis, 100, flipped); // Clean up the two extra pixels p = data + width - 1; @@ -331,7 +392,8 @@ void VolumetricModifier::createAnotherVolume() m_volumeItem2->setPosition(QVector3D(0.5f, -0.5f, 0.0f)); QImage logo; - logo.load(QStringLiteral(":/logo.png")); + logo.load(QStringLiteral(":/logo_no_padding.png")); + //logo.load(QStringLiteral(":/logo.png")); logo = logo.convertToFormat(QImage::Format_ARGB8555_Premultiplied); qDebug() << "second image dimensions:" << logo.width() << logo.height() << logo.byteCount() << (logo.width() * logo.height()) @@ -361,8 +423,8 @@ void VolumetricModifier::createAnotherVolume() // Change one picture using subtexture replacement QImage flipped = logo.mirrored(); - m_volumeItem2->setSubTextureData(100, flipped); - m_volumeItem2->setAlphaMultiplier(0.2f); + m_volumeItem2->setSubTextureData(Qt::ZAxis, 100, flipped); + //m_volumeItem2->setAlphaMultiplier(0.2f); m_volumeItem2->setPreserveOpacity(false); } diff --git a/tests/volumetrictest/volumetrictest.h b/tests/volumetrictest/volumetrictest.h index f21fd528..b1b98455 100644 --- a/tests/volumetrictest/volumetrictest.h +++ b/tests/volumetrictest/volumetrictest.h @@ -45,11 +45,14 @@ public slots: void adjustSliceY(int value); void adjustSliceZ(int value); void handleFpsChange(); + void testSubtextureSetting(); private: void createVolume(); void createAnotherVolume(); void createYetAnotherVolume(); + void checkRenderCase(int id, Qt::Axis axis, int index, const QVector &dataBefore, + QCustom3DVolume *volumeItem); Q3DScatter *m_graph; QCustom3DVolume *m_volumeItem; diff --git a/tests/volumetrictest/volumetrictest.qrc b/tests/volumetrictest/volumetrictest.qrc index 5b9623f0..7cd8533b 100644 --- a/tests/volumetrictest/volumetrictest.qrc +++ b/tests/volumetrictest/volumetrictest.qrc @@ -2,5 +2,6 @@ logo.png cubeFilledFlat.obj + logo_no_padding.png -- cgit v1.2.3