From ddb9be979d93b7e17f1067dc6056de54d9828b29 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Tue, 9 Sep 2014 11:30:15 +0300 Subject: Limit volume to axis ranges The volume object that would go partially outside axis ranges is scale and repositioned so that it only renders the portion that is inside the axis ranges. Change-Id: I792494e437998ba6276f58fab645767276c1476d Reviewed-by: Mika Salmela --- tests/volumetrictest/main.cpp | 5 +- tests/volumetrictest/volumetrictest.cpp | 90 +++++++++++++++++++++++++++------ tests/volumetrictest/volumetrictest.h | 11 ++-- 3 files changed, 86 insertions(+), 20 deletions(-) (limited to 'tests') diff --git a/tests/volumetrictest/main.cpp b/tests/volumetrictest/main.cpp index 02f67d6c..7b18ceab 100644 --- a/tests/volumetrictest/main.cpp +++ b/tests/volumetrictest/main.cpp @@ -17,7 +17,6 @@ ****************************************************************************/ #include "volumetrictest.h" - #include #include #include @@ -32,7 +31,9 @@ int main(int argc, char **argv) { QApplication app(argc, argv); - Q3DScatter *graph = new Q3DScatter(); + //Q3DScatter *graph = new Q3DScatter(); + //Q3DSurface *graph = new Q3DSurface(); + Q3DBars *graph = new Q3DBars(); QWidget *container = QWidget::createWindowContainer(graph); QSize screenSize = graph->screen()->size(); diff --git a/tests/volumetrictest/volumetrictest.cpp b/tests/volumetrictest/volumetrictest.cpp index 6d7da021..a277c8b0 100644 --- a/tests/volumetrictest/volumetrictest.cpp +++ b/tests/volumetrictest/volumetrictest.cpp @@ -17,6 +17,7 @@ ****************************************************************************/ #include "volumetrictest.h" +#include #include #include #include @@ -31,14 +32,14 @@ using namespace QtDataVisualization; const int imageCount = 512; -const float xMiddle = 10.0f; -const float yMiddle = 12.5f; -const float zMiddle = -40.0f; +const float xMiddle = 100.0f; +const float yMiddle = 2.5f; +const float zMiddle = 100.0f; const float xRange = 40.0f; const float yRange = 7.5f; const float zRange = 20.0f; -VolumetricModifier::VolumetricModifier(Q3DScatter *scatter) +VolumetricModifier::VolumetricModifier(QAbstract3DGraph *scatter) : m_graph(scatter), m_volumeItem(0), m_volumeItem2(0), @@ -52,13 +53,55 @@ VolumetricModifier::VolumetricModifier(Q3DScatter *scatter) m_graph->setShadowQuality(QAbstract3DGraph::ShadowQualityNone); m_graph->scene()->activeCamera()->setCameraPreset(Q3DCamera::CameraPresetFront); m_graph->setOrthoProjection(true); - //m_graph->scene()->activeCamera()->setTarget(QVector3D(0.5f, 0.5f, 0.5f)); - m_graph->axisX()->setRange(xMiddle - xRange, xMiddle + xRange); - m_graph->axisX()->setSegmentCount(8); - m_graph->axisY()->setRange(yMiddle - yRange, yMiddle + yRange); - m_graph->axisY()->setSegmentCount(3); - m_graph->axisZ()->setRange(zMiddle - zRange, zMiddle + zRange); - m_graph->axisZ()->setSegmentCount(8); + //m_graph->scene()->activeCamera()->setTarget(QVector3D(-2.0f, 1.0f, 2.0f)); + m_scatterGraph = qobject_cast(m_graph); + m_surfaceGraph = qobject_cast(m_graph); + m_barGraph = qobject_cast(m_graph); + if (m_scatterGraph) { + m_scatterGraph->axisX()->setRange(xMiddle - xRange, xMiddle + xRange); + m_scatterGraph->axisX()->setSegmentCount(8); + m_scatterGraph->axisY()->setRange(yMiddle - yRange, yMiddle + yRange); + m_scatterGraph->axisY()->setSegmentCount(3); + m_scatterGraph->axisZ()->setRange(zMiddle - zRange, zMiddle + zRange); + m_scatterGraph->axisZ()->setSegmentCount(8); + } else if (m_surfaceGraph) { + m_surfaceGraph->axisX()->setRange(xMiddle - xRange, xMiddle + xRange); + m_surfaceGraph->axisX()->setSegmentCount(8); + m_surfaceGraph->axisY()->setRange(yMiddle - yRange, yMiddle + yRange); + m_surfaceGraph->axisY()->setSegmentCount(3); + m_surfaceGraph->axisZ()->setRange(zMiddle - zRange, zMiddle + zRange); + m_surfaceGraph->axisZ()->setSegmentCount(8); + } else if (m_barGraph) { + QStringList rowLabels; + QStringList columnLabels; + for (int i = 0; i < xMiddle + xRange; i++) { + if (i % 5 == 0) + columnLabels << QString::number(i); + else + columnLabels << QString(); + } + for (int i = 0; i < zMiddle + zRange; i++) { + if (i % 5 == 0) + rowLabels << QString::number(i); + else + rowLabels << QString(); + } + + QBar3DSeries *series = new QBar3DSeries; + QBarDataArray *array = new QBarDataArray(); + array->reserve(zRange * 2 + 1); + for (int i = 0; i < zRange * 2 + 1; i++) + array->append(new QBarDataRow(xRange * 2 + 1)); + + series->dataProxy()->resetArray(array, rowLabels, columnLabels); + m_barGraph->addSeries(series); + + m_barGraph->columnAxis()->setRange(xMiddle - xRange, xMiddle + xRange); + m_barGraph->valueAxis()->setRange(yMiddle - yRange, yMiddle + yRange); + m_barGraph->rowAxis()->setRange(zMiddle - zRange, zMiddle + zRange); + //m_barGraph->setReflection(true); + } + m_graph->activeTheme()->setBackgroundEnabled(false); createVolume(); createAnotherVolume(); @@ -67,6 +110,7 @@ VolumetricModifier::VolumetricModifier(Q3DScatter *scatter) // m_volumeItem->setUseHighDefShader(false); // m_volumeItem2->setUseHighDefShader(false); // m_volumeItem3->setUseHighDefShader(false); + m_volumeItem->setScalingAbsolute(false); m_volumeItem2->setScalingAbsolute(false); m_volumeItem3->setScalingAbsolute(false); @@ -81,7 +125,7 @@ VolumetricModifier::VolumetricModifier(Q3DScatter *scatter) m_plainItem->setMeshFile(QStringLiteral(":/mesh")); m_plainItem->setTextureImage(texture); m_plainItem->setRotation(m_volumeItem->rotation()); - m_plainItem->setPosition(QVector3D(30.0f, 17.5f, -30.0f)); + m_plainItem->setPosition(QVector3D(xMiddle + xRange / 2.0f, yMiddle + yRange / 2.0f, zMiddle)); m_plainItem->setScaling(QVector3D(20.0f, 5.0f, 10.0f)); m_plainItem->setScalingAbsolute(false); @@ -243,19 +287,34 @@ void VolumetricModifier::testSubtextureSetting() void VolumetricModifier::adjustRangeX(int value) { float adjustment = float(value - 512) / 10.0f; - m_graph->axisX()->setRange(xMiddle + adjustment - xRange, xMiddle + adjustment + xRange); + if (m_scatterGraph) + m_scatterGraph->axisX()->setRange(xMiddle + adjustment - xRange, xMiddle + adjustment + xRange); + if (m_surfaceGraph) + m_surfaceGraph->axisX()->setRange(xMiddle + adjustment - xRange, xMiddle + adjustment + xRange); + if (m_barGraph) + m_barGraph->columnAxis()->setRange(xMiddle + adjustment - xRange, xMiddle + adjustment + xRange); } void VolumetricModifier::adjustRangeY(int value) { float adjustment = float(value - 512) / 10.0f; - m_graph->axisY()->setRange(yMiddle + adjustment - yRange, yMiddle + adjustment + yRange); + if (m_scatterGraph) + m_scatterGraph->axisY()->setRange(yMiddle + adjustment - yRange, yMiddle + adjustment + yRange); + if (m_surfaceGraph) + m_surfaceGraph->axisY()->setRange(yMiddle + adjustment - yRange, yMiddle + adjustment + yRange); + if (m_barGraph) + m_barGraph->valueAxis()->setRange(yMiddle + adjustment - yRange, yMiddle + adjustment + yRange); } void VolumetricModifier::adjustRangeZ(int value) { float adjustment = float(value - 512) / 10.0f; - m_graph->axisZ()->setRange(zMiddle + adjustment - zRange, zMiddle + adjustment + zRange); + if (m_scatterGraph) + m_scatterGraph->axisZ()->setRange(zMiddle + adjustment - zRange, zMiddle + adjustment + zRange); + if (m_surfaceGraph) + m_surfaceGraph->axisZ()->setRange(zMiddle + adjustment - zRange, zMiddle + adjustment + zRange); + if (m_barGraph) + m_barGraph->rowAxis()->setRange(zMiddle + adjustment - zRange, zMiddle + adjustment + zRange); } void VolumetricModifier::testBoundsSetting() @@ -303,6 +362,7 @@ void VolumetricModifier::createVolume() m_volumeItem->setTextureFormat(QImage::Format_ARGB32); // m_volumeItem->setRotation(QQuaternion::fromAxisAndAngle(1.0f, 1.0f, 0.0f, 10.0f)); m_volumeItem->setPosition(QVector3D(xMiddle - (xRange / 2.0f), yMiddle + (yRange / 2.0f), zMiddle)); + //m_volumeItem->setPosition(QVector3D(xMiddle, yMiddle, zMiddle)); QImage logo; logo.load(QStringLiteral(":/logo_no_padding.png")); diff --git a/tests/volumetrictest/volumetrictest.h b/tests/volumetrictest/volumetrictest.h index 48c805d4..9029f7b9 100644 --- a/tests/volumetrictest/volumetrictest.h +++ b/tests/volumetrictest/volumetrictest.h @@ -19,9 +19,11 @@ #ifndef VOLUMETRICMODIFIER_H #define VOLUMETRICMODIFIER_H -#include #include #include +#include +#include +#include class QLabel; @@ -31,7 +33,7 @@ class VolumetricModifier : public QObject { Q_OBJECT public: - explicit VolumetricModifier(Q3DScatter *scatter); + explicit VolumetricModifier(QAbstract3DGraph *scatter); ~VolumetricModifier(); void setFpsLabel(QLabel *fpsLabel); @@ -58,7 +60,10 @@ private: void checkRenderCase(int id, Qt::Axis axis, int index, const QVector &dataBefore, QCustom3DVolume *volumeItem); - Q3DScatter *m_graph; + QAbstract3DGraph *m_graph; + Q3DScatter *m_scatterGraph; + Q3DSurface *m_surfaceGraph; + Q3DBars *m_barGraph; QCustom3DVolume *m_volumeItem; QCustom3DVolume *m_volumeItem2; QCustom3DVolume *m_volumeItem3; -- cgit v1.2.3