From e5f6ab99b413ad9b8481ad923c5a4a5bc6513ff2 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Fri, 12 Sep 2014 11:27:24 +0300 Subject: Implement volume slice frames MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I409f3c95892b26ca6097dd4509109fc9978b9900 Reviewed-by: Tomi Korpipää --- examples/datavisualization/volumetric/main.cpp | 9 ++++- .../datavisualization/volumetric/volumetric.cpp | 47 +++++++++++++++++++--- examples/datavisualization/volumetric/volumetric.h | 5 +++ 3 files changed, 54 insertions(+), 7 deletions(-) (limited to 'examples/datavisualization') diff --git a/examples/datavisualization/volumetric/main.cpp b/examples/datavisualization/volumetric/main.cpp index 98330396..faf379ec 100644 --- a/examples/datavisualization/volumetric/main.cpp +++ b/examples/datavisualization/volumetric/main.cpp @@ -168,6 +168,10 @@ int main(int argc, char **argv) "Note: A high end graphics card is\nrecommended with the HD shader\nwhen the volume contains a lot of\ntransparent areas.")); performanceNoteLabel->setFrameShape(QFrame::Box); + QCheckBox *drawSliceFramesCheckBox = new QCheckBox(widget); + drawSliceFramesCheckBox->setText(QStringLiteral("Draw slice frames")); + drawSliceFramesCheckBox->setChecked(false); + vLayout->addWidget(sliceXCheckBox); vLayout->addWidget(sliceXSlider); vLayout->addWidget(sliceImageXLabel); @@ -176,7 +180,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(drawSliceFramesCheckBox, 1, Qt::AlignTop); vLayout2->addWidget(fpsCheckBox); vLayout2->addWidget(fpsLabel); vLayout2->addWidget(textureDetailGroupBox); @@ -234,6 +239,8 @@ int main(int argc, char **argv) &VolumetricModifier::toggleAreaMine); QObject::connect(areaMountainRB, &QRadioButton::toggled, modifier, &VolumetricModifier::toggleAreaMountain); + QObject::connect(drawSliceFramesCheckBox, &QCheckBox::stateChanged, modifier, + &VolumetricModifier::setDrawSliceFrames); widget->show(); return app.exec(); diff --git a/examples/datavisualization/volumetric/volumetric.cpp b/examples/datavisualization/volumetric/volumetric.cpp index 54e930d2..80df4bd5 100644 --- a/examples/datavisualization/volumetric/volumetric.cpp +++ b/examples/datavisualization/volumetric/volumetric.cpp @@ -58,6 +58,9 @@ VolumetricModifier::VolumetricModifier(Q3DScatter *scatter) m_sliceIndexX(lowDetailSize / 2), m_sliceIndexY(lowDetailSize / 4), m_sliceIndexZ(lowDetailSize / 2), + m_slicingX(false), + m_slicingY(false), + m_slicingZ(false), m_mediumDetailRB(0), m_highDetailRB(0), m_lowDetailData(0), @@ -79,6 +82,7 @@ VolumetricModifier::VolumetricModifier(Q3DScatter *scatter) m_graph->setShadowQuality(QAbstract3DGraph::ShadowQualityNone); m_graph->scene()->activeCamera()->setCameraPreset(Q3DCamera::CameraPresetFront); m_graph->setOrthoProjection(true); + m_graph->activeTheme()->setBackgroundEnabled(false); toggleAreaAll(true); @@ -162,6 +166,12 @@ VolumetricModifier::VolumetricModifier(Q3DScatter *scatter) m_volumeItem->setColorTable(m_colorTable1); + m_volumeItem->setSliceFrameGaps(QVector3D(0.01f, 0.02f, 0.01f)); + m_volumeItem->setSliceFrameThicknesses(QVector3D(0.0025f, 0.005f, 0.0025f)); + m_volumeItem->setSliceFrameWidths(QVector3D(0.0025f, 0.005f, 0.0025f)); + m_volumeItem->setDrawSliceFrames(false); + handleSlicingChanges(); + m_graph->addCustomItem(m_volumeItem); m_timer.start(0); @@ -226,20 +236,20 @@ void VolumetricModifier::setAlphaMultiplierLabel(QLabel *label) void VolumetricModifier::sliceX(int enabled) { - if (m_volumeItem) - m_volumeItem->setSliceIndexX(enabled ? m_sliceIndexX : -1); + m_slicingX = enabled; + handleSlicingChanges(); } void VolumetricModifier::sliceY(int enabled) { - if (m_volumeItem) - m_volumeItem->setSliceIndexY(enabled ? m_sliceIndexY : -1); + m_slicingY = enabled; + handleSlicingChanges(); } void VolumetricModifier::sliceZ(int enabled) { - if (m_volumeItem) - m_volumeItem->setSliceIndexZ(enabled ? m_sliceIndexZ : -1); + m_slicingZ = enabled; + handleSlicingChanges(); } void VolumetricModifier::adjustSliceX(int value) @@ -482,6 +492,12 @@ void VolumetricModifier::toggleAreaMountain(bool enabled) } } +void VolumetricModifier::setDrawSliceFrames(int enabled) +{ + if (m_volumeItem) + m_volumeItem->setDrawSliceFrames(enabled); +} + void VolumetricModifier::initHeightMap(QString fileName, QVector &layerData) { QImage heightImage(fileName); @@ -607,6 +623,25 @@ void VolumetricModifier::excavateMineBlock(int textureSize, int dataIndex, int s } } +void VolumetricModifier::handleSlicingChanges() +{ + if (m_volumeItem) { + if (m_slicingX || m_slicingY || m_slicingZ) { + // Only show slices of selected dimensions + m_volumeItem->setDrawSlices(true); + m_volumeItem->setSliceIndexX(m_slicingX ? m_sliceIndexX : -1); + m_volumeItem->setSliceIndexY(m_slicingY ? m_sliceIndexY : -1); + m_volumeItem->setSliceIndexZ(m_slicingZ ? m_sliceIndexZ : -1); + } else { + // Show slice frames for all dimenstions when not actually slicing + m_volumeItem->setDrawSlices(false); + m_volumeItem->setSliceIndexX(m_sliceIndexX); + m_volumeItem->setSliceIndexY(m_sliceIndexY); + m_volumeItem->setSliceIndexZ(m_sliceIndexZ); + } + } +} + void VolumetricModifier::initMineShaftArray() { m_mineShaftArray << QPair(QVector3D(0.7f, 0.1f, 0.7f), diff --git a/examples/datavisualization/volumetric/volumetric.h b/examples/datavisualization/volumetric/volumetric.h index 180686fb..7a4e7179 100644 --- a/examples/datavisualization/volumetric/volumetric.h +++ b/examples/datavisualization/volumetric/volumetric.h @@ -66,6 +66,7 @@ public slots: void toggleAreaAll(bool enabled); void toggleAreaMine(bool enabled); void toggleAreaMountain(bool enabled); + void setDrawSliceFrames(int enabled); private: @@ -76,12 +77,16 @@ private: int excavateMineShaft(int textureSize, int startIndex, int count, QVector *textureData); void excavateMineBlock(int textureSize, int dataIndex, int size, QVector *textureData); + void handleSlicingChanges(); Q3DScatter *m_graph; QCustom3DVolume *m_volumeItem; int m_sliceIndexX; int m_sliceIndexY; int m_sliceIndexZ; + bool m_slicingX; + bool m_slicingY; + bool m_slicingZ; QLabel *m_fpsLabel; QRadioButton *m_mediumDetailRB; QRadioButton *m_highDetailRB; -- cgit v1.2.3