From f9bb71fd11cce59d74e78202a1117c8abb3a2e44 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Fri, 22 Aug 2014 16:40:52 +0300 Subject: Implement API function for rendering volume slice to an image. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: Iea18967c3b525a8d4507a06e6541c85ed3abb470 Reviewed-by: Tomi Korpipää --- examples/datavisualization/volumetric/main.cpp | 22 ++++++++- .../datavisualization/volumetric/volumetric.cpp | 56 ++++++++++++++++++---- examples/datavisualization/volumetric/volumetric.h | 4 ++ 3 files changed, 72 insertions(+), 10 deletions(-) (limited to 'examples/datavisualization') diff --git a/examples/datavisualization/volumetric/main.cpp b/examples/datavisualization/volumetric/main.cpp index 66f62779..5a90070e 100644 --- a/examples/datavisualization/volumetric/main.cpp +++ b/examples/datavisualization/volumetric/main.cpp @@ -106,22 +106,42 @@ int main(int argc, char **argv) colorTableCheckBox->setText(QStringLiteral("Alternate color table")); colorTableCheckBox->setChecked(false); + QLabel *sliceImageXLabel = new QLabel(widget); + QLabel *sliceImageYLabel = new QLabel(widget); + QLabel *sliceImageZLabel = new QLabel(widget); + sliceImageXLabel->setMinimumSize(QSize(200, 100)); + sliceImageYLabel->setMinimumSize(QSize(200, 200)); + sliceImageZLabel->setMinimumSize(QSize(200, 100)); + sliceImageXLabel->setMaximumSize(QSize(200, 100)); + sliceImageYLabel->setMaximumSize(QSize(200, 200)); + sliceImageZLabel->setMaximumSize(QSize(200, 100)); + sliceImageXLabel->setFrameShape(QFrame::Box); + sliceImageYLabel->setFrameShape(QFrame::Box); + sliceImageZLabel->setFrameShape(QFrame::Box); + sliceImageXLabel->setScaledContents(true); + sliceImageYLabel->setScaledContents(true); + sliceImageZLabel->setScaledContents(true); + vLayout->addWidget(fpsCheckBox); vLayout->addWidget(fpsLabel); vLayout->addWidget(textureDetailGroupBox); vLayout->addWidget(colorTableCheckBox); vLayout->addWidget(sliceXCheckBox); vLayout->addWidget(sliceXSlider); + vLayout->addWidget(sliceImageXLabel); vLayout->addWidget(sliceYCheckBox); vLayout->addWidget(sliceYSlider); + vLayout->addWidget(sliceImageYLabel); vLayout->addWidget(sliceZCheckBox); - vLayout->addWidget(sliceZSlider, 1, Qt::AlignTop); + vLayout->addWidget(sliceZSlider); + vLayout->addWidget(sliceImageZLabel, 1, Qt::AlignTop); VolumetricModifier *modifier = new VolumetricModifier(graph); modifier->setFpsLabel(fpsLabel); modifier->setMediumDetailRB(mediumDetailRB); modifier->setHighDetailRB(highDetailRB); modifier->setSliceSliders(sliceXSlider, sliceYSlider, sliceZSlider); + modifier->setSliceLabels(sliceImageXLabel, sliceImageYLabel, sliceImageZLabel); QObject::connect(fpsCheckBox, &QCheckBox::stateChanged, modifier, &VolumetricModifier::setFpsMeasurement); diff --git a/examples/datavisualization/volumetric/volumetric.cpp b/examples/datavisualization/volumetric/volumetric.cpp index b4ea769c..a553ccf8 100644 --- a/examples/datavisualization/volumetric/volumetric.cpp +++ b/examples/datavisualization/volumetric/volumetric.cpp @@ -51,7 +51,10 @@ VolumetricModifier::VolumetricModifier(Q3DScatter *scatter) m_highDetailIndex(0), m_sliceSliderX(0), m_sliceSliderY(0), - m_sliceSliderZ(0) + m_sliceSliderZ(0), + m_sliceLabelX(0), + m_sliceLabelY(0), + m_sliceLabelZ(0) { m_graph->activeTheme()->setType(Q3DTheme::ThemeQt); m_graph->setShadowQuality(QAbstract3DGraph::ShadowQualityNone); @@ -95,12 +98,12 @@ VolumetricModifier::VolumetricModifier(Q3DScatter *scatter) } // The alternate color table. - // The first visible layer is a thin yellow one, and rest of the volume uses a smooth gradient. + // The first visible layer is a thin single color, and rest of the volume uses a smooth gradient. for (int i = 1; i < colorTableSize; i++) { if (i < cutOffColorIndex) m_colorTable2[i] = qRgba(0, 0, 0, 0); else if (i < cutOffColorIndex + 4) - m_colorTable2[i] = qRgba(255, 255, 0, 255); + m_colorTable2[i] = qRgba(75, 150, 0, 255); else m_colorTable2[i] = qRgba(i, 0, 255 - i, 255); } @@ -108,6 +111,7 @@ VolumetricModifier::VolumetricModifier(Q3DScatter *scatter) m_volumeItem->setColorTable(m_colorTable1); m_graph->addCustomItem(m_volumeItem); + m_timer.start(0); #else // OpenGL ES2 doesn't support 3D textures, so show a warning label instead @@ -152,6 +156,17 @@ void VolumetricModifier::setHighDetailRB(QRadioButton *button) m_highDetailRB = button; } +void VolumetricModifier::setSliceLabels(QLabel *xLabel, QLabel *yLabel, QLabel *zLabel) +{ + m_sliceLabelX = xLabel; + m_sliceLabelY = yLabel; + m_sliceLabelZ = zLabel; + + adjustSliceX(m_sliceSliderX->value()); + adjustSliceY(m_sliceSliderY->value()); + adjustSliceZ(m_sliceSliderZ->value()); +} + void VolumetricModifier::sliceX(int enabled) { if (m_volumeItem) @@ -173,22 +188,40 @@ void VolumetricModifier::sliceZ(int enabled) void VolumetricModifier::adjustSliceX(int value) { m_sliceIndexX = value / (1024 / m_volumeItem->textureWidth()); - if (m_volumeItem && m_volumeItem->sliceIndexX() != -1) - m_volumeItem->setSliceIndexX(m_sliceIndexX); + if (m_sliceIndexX == m_volumeItem->textureWidth()) + m_sliceIndexX--; + if (m_volumeItem) { + if (m_volumeItem->sliceIndexX() != -1) + m_volumeItem->setSliceIndexX(m_sliceIndexX); + m_sliceLabelX->setPixmap(QPixmap::fromImage( + m_volumeItem->renderSlice(Qt::XAxis, m_sliceIndexX))); + } } void VolumetricModifier::adjustSliceY(int value) { m_sliceIndexY = value / (1024 / m_volumeItem->textureHeight()); - if (m_volumeItem && m_volumeItem->sliceIndexY() != -1) - m_volumeItem->setSliceIndexY(m_sliceIndexY); + if (m_sliceIndexY == m_volumeItem->textureHeight()) + m_sliceIndexY--; + if (m_volumeItem) { + if (m_volumeItem->sliceIndexY() != -1) + m_volumeItem->setSliceIndexY(m_sliceIndexY); + m_sliceLabelY->setPixmap(QPixmap::fromImage( + m_volumeItem->renderSlice(Qt::YAxis, m_sliceIndexY))); + } } void VolumetricModifier::adjustSliceZ(int value) { m_sliceIndexZ = value / (1024 / m_volumeItem->textureDepth()); - if (m_volumeItem && m_volumeItem->sliceIndexZ() != -1) - m_volumeItem->setSliceIndexZ(m_sliceIndexZ); + if (m_sliceIndexZ == m_volumeItem->textureDepth()) + m_sliceIndexZ--; + if (m_volumeItem) { + if (m_volumeItem->sliceIndexZ() != -1) + m_volumeItem->setSliceIndexZ(m_sliceIndexZ); + m_sliceLabelZ->setPixmap(QPixmap::fromImage( + m_volumeItem->renderSlice(Qt::ZAxis, m_sliceIndexZ))); + } } void VolumetricModifier::handleZoomLevelChange() @@ -282,6 +315,11 @@ void VolumetricModifier::changeColorTable(int enabled) m_volumeItem->setColorTable(m_colorTable2); else m_volumeItem->setColorTable(m_colorTable1); + + // Rerender image labels + adjustSliceX(m_sliceSliderX->value()); + adjustSliceY(m_sliceSliderY->value()); + adjustSliceZ(m_sliceSliderZ->value()); } int VolumetricModifier::createVolume(int textureSize, int startIndex, int count, diff --git a/examples/datavisualization/volumetric/volumetric.h b/examples/datavisualization/volumetric/volumetric.h index bb7fb3fe..eb8a4172 100644 --- a/examples/datavisualization/volumetric/volumetric.h +++ b/examples/datavisualization/volumetric/volumetric.h @@ -40,6 +40,7 @@ public: void setFpsLabel(QLabel *fpsLabel); void setMediumDetailRB(QRadioButton *button); void setHighDetailRB(QRadioButton *button); + void setSliceLabels(QLabel *xLabel, QLabel *yLabel, QLabel *zLabel); public slots: void sliceX(int enabled); @@ -82,6 +83,9 @@ private: QSlider *m_sliceSliderZ; QVector m_colorTable1; QVector m_colorTable2; + QLabel *m_sliceLabelX; + QLabel *m_sliceLabelY; + QLabel *m_sliceLabelZ; }; #endif -- cgit v1.2.3