diff options
author | Miikka Heikkinen <miikka.heikkinen@digia.com> | 2014-01-27 13:10:44 +0200 |
---|---|---|
committer | Miikka Heikkinen <miikka.heikkinen@digia.com> | 2014-01-27 13:13:58 +0200 |
commit | b368e57e59351736f9ad06834a743a7c1b49d368 (patch) | |
tree | 3b7d42569905d8cde0ca7571cd664428354a50dd /src/datavisualization/engine/abstract3drenderer.cpp | |
parent | eb3d0514ca886db33776522ea00f27b69bc86ad1 (diff) | |
parent | 05d06fbc61f07e400b519a9b020c2473398627c1 (diff) |
Merge branch 'develop'v1.0.0-beta1
Change-Id: I1c9a255eb8f30a24b665856d3711f0abe77c6ef4
Diffstat (limited to 'src/datavisualization/engine/abstract3drenderer.cpp')
-rw-r--r-- | src/datavisualization/engine/abstract3drenderer.cpp | 133 |
1 files changed, 77 insertions, 56 deletions
diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp index 74088b7c..7824000e 100644 --- a/src/datavisualization/engine/abstract3drenderer.cpp +++ b/src/datavisualization/engine/abstract3drenderer.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2013 Digia Plc +** Copyright (C) 2014 Digia Plc ** All rights reserved. ** For any questions to Digia, please use contact form at http://qt.digia.com ** @@ -17,7 +17,7 @@ ****************************************************************************/ #include "abstract3drenderer_p.h" -#include "q3dvalueaxis.h" +#include "qvalue3daxis.h" #include "texturehelper_p.h" #include "utils_p.h" #include "q3dscene_p.h" @@ -27,27 +27,28 @@ #include "q3dtheme_p.h" #include "objecthelper_p.h" -Q_DECLARE_METATYPE(QtDataVisualization::QDataVis::ShadowQuality) - -QT_DATAVISUALIZATION_BEGIN_NAMESPACE +QT_BEGIN_NAMESPACE_DATAVISUALIZATION Abstract3DRenderer::Abstract3DRenderer(Abstract3DController *controller) : QObject(0), m_hasNegativeValues(false), m_cachedTheme(new Q3DTheme()), m_drawer(new Drawer(m_cachedTheme)), - m_cachedShadowQuality(QDataVis::ShadowQualityMedium), + m_cachedShadowQuality(QAbstract3DGraph::ShadowQualityMedium), m_autoScaleAdjustment(1.0f), - m_cachedSelectionMode(QDataVis::SelectionNone), + m_cachedSelectionMode(QAbstract3DGraph::SelectionNone), m_textureHelper(0), m_cachedScene(new Q3DScene()), m_selectionDirty(true), m_selectionState(SelectNone), - m_devicePixelRatio(1.0f) - #ifdef DISPLAY_RENDER_SPEED + m_devicePixelRatio(1.0f), + m_selectionLabelDirty(true), + m_clickPending(false), + m_clickedSeries(0) +#ifdef DISPLAY_RENDER_SPEED , m_isFirstFrame(true), m_numFrames(0) - #endif +#endif { QObject::connect(m_drawer, &Drawer::drawerChanged, this, &Abstract3DRenderer::updateTextures); @@ -85,9 +86,9 @@ void Abstract3DRenderer::initializeOpenGL() m_textureHelper = new TextureHelper(); m_drawer->initializeOpenGL(); - axisCacheForOrientation(Q3DAbstractAxis::AxisOrientationX).setDrawer(m_drawer); - axisCacheForOrientation(Q3DAbstractAxis::AxisOrientationY).setDrawer(m_drawer); - axisCacheForOrientation(Q3DAbstractAxis::AxisOrientationZ).setDrawer(m_drawer); + axisCacheForOrientation(QAbstract3DAxis::AxisOrientationX).setDrawer(m_drawer); + axisCacheForOrientation(QAbstract3DAxis::AxisOrientationY).setDrawer(m_drawer); + axisCacheForOrientation(QAbstract3DAxis::AxisOrientationZ).setDrawer(m_drawer); } void Abstract3DRenderer::render(const GLuint defaultFboHandle) @@ -102,7 +103,8 @@ void Abstract3DRenderer::render(const GLuint defaultFboHandle) // Measure speed (as milliseconds per frame) m_numFrames++; if (m_lastFrameTime.elapsed() >= 1000) { // print only if last measurement was more than 1s ago - qDebug() << float(m_lastFrameTime.elapsed()) / float(m_numFrames) << "ms/frame (=" << float(m_numFrames) << "fps)"; + qDebug() << float(m_lastFrameTime.elapsed()) / float(m_numFrames) << "ms/frame (=" + << float(m_numFrames) << "fps)"; m_numFrames = 0; m_lastFrameTime.restart(); } @@ -122,9 +124,15 @@ void Abstract3DRenderer::render(const GLuint defaultFboHandle) m_viewport.y(), m_viewport.width(), m_viewport.height()); + glScissor(m_viewport.x(), + m_viewport.y(), + m_viewport.width(), + m_viewport.height()); + glEnable(GL_SCISSOR_TEST); QVector3D clearColor = Utils::vectorFromColor(m_cachedTheme->windowColor()); glClearColor(clearColor.x(), clearColor.y(), clearColor.z(), 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + glDisable(GL_SCISSOR_TEST); } QString Abstract3DRenderer::generateValueLabel(const QString &format, float value) @@ -145,7 +153,8 @@ void Abstract3DRenderer::updateInputPosition(const QPoint &position) m_inputPosition = position; } -void Abstract3DRenderer::initGradientShaders(const QString &vertexShader, const QString &fragmentShader) +void Abstract3DRenderer::initGradientShaders(const QString &vertexShader, + const QString &fragmentShader) { // Do nothing by default Q_UNUSED(vertexShader) @@ -155,14 +164,10 @@ void Abstract3DRenderer::initGradientShaders(const QString &vertexShader, const void Abstract3DRenderer::updateTheme(Q3DTheme *theme) { // Synchronize the controller theme with renderer - bool changed = theme->d_ptr->sync(*m_cachedTheme->d_ptr); + bool updateDrawer = theme->d_ptr->sync(*m_cachedTheme->d_ptr); - if (changed) { - // Update drawer if sync changed something + if (updateDrawer) m_drawer->setTheme(m_cachedTheme); - // Re-initialize shaders - reInitShaders(); - } } void Abstract3DRenderer::updateScene(Q3DScene *scene) @@ -189,11 +194,15 @@ void Abstract3DRenderer::updateScene(Q3DScene *scene) updateInputPosition(QPoint(logicalPixelPosition.x() * m_devicePixelRatio, logicalPixelPosition.y() * m_devicePixelRatio)); + // Synchronize the renderer scene to controller scene + scene->d_ptr->sync(*m_cachedScene->d_ptr); + if (Q3DScene::invalidSelectionPoint() == logicalPixelPosition) { updateSelectionState(SelectNone); } else { // Selections are one-shot, reset selection active to false before processing scene->setSelectionQueryPosition(Q3DScene::invalidSelectionPoint()); + m_clickPending = true; if (scene->isSlicingActive()) { if (scene->isPointInPrimarySubView(logicalPixelPosition)) @@ -206,15 +215,12 @@ void Abstract3DRenderer::updateScene(Q3DScene *scene) updateSelectionState(SelectOnScene); } } - - // Synchronize the controller scene with renderer - scene->d_ptr->sync(*m_cachedScene->d_ptr); } void Abstract3DRenderer::reInitShaders() { #if !defined(QT_OPENGL_ES_2) - if (m_cachedShadowQuality > QDataVis::ShadowQualityNone) { + if (m_cachedShadowQuality > QAbstract3DGraph::ShadowQualityNone) { initGradientShaders(QStringLiteral(":/shaders/vertexShadow"), QStringLiteral(":/shaders/fragmentShadowNoTexColorOnY")); initShaders(QStringLiteral(":/shaders/vertexShadow"), @@ -244,15 +250,15 @@ void Abstract3DRenderer::handleShadowQualityChange() reInitShaders(); #if defined(QT_OPENGL_ES_2) - if (m_cachedShadowQuality != QDataVis::ShadowQualityNone) { - emit requestShadowQuality(QDataVis::ShadowQualityNone); + if (m_cachedShadowQuality != QAbstract3DGraph::ShadowQualityNone) { + emit requestShadowQuality(QAbstract3DGraph::ShadowQualityNone); qWarning("Shadows are not yet supported for OpenGL ES2"); - m_cachedShadowQuality = QDataVis::ShadowQualityNone; + m_cachedShadowQuality = QAbstract3DGraph::ShadowQualityNone; } #endif } -void Abstract3DRenderer::updateSelectionMode(QDataVis::SelectionFlags mode) +void Abstract3DRenderer::updateSelectionMode(QAbstract3DGraph::SelectionFlags mode) { m_cachedSelectionMode = mode; m_selectionDirty = true; @@ -280,39 +286,46 @@ void Abstract3DRenderer::handleResize() #endif } -void Abstract3DRenderer::updateAxisType(Q3DAbstractAxis::AxisOrientation orientation, Q3DAbstractAxis::AxisType type) +void Abstract3DRenderer::updateAxisType(QAbstract3DAxis::AxisOrientation orientation, + QAbstract3DAxis::AxisType type) { axisCacheForOrientation(orientation).setType(type); } -void Abstract3DRenderer::updateAxisTitle(Q3DAbstractAxis::AxisOrientation orientation, const QString &title) +void Abstract3DRenderer::updateAxisTitle(QAbstract3DAxis::AxisOrientation orientation, + const QString &title) { axisCacheForOrientation(orientation).setTitle(title); } -void Abstract3DRenderer::updateAxisLabels(Q3DAbstractAxis::AxisOrientation orientation, const QStringList &labels) +void Abstract3DRenderer::updateAxisLabels(QAbstract3DAxis::AxisOrientation orientation, + const QStringList &labels) { axisCacheForOrientation(orientation).setLabels(labels); } -void Abstract3DRenderer::updateAxisRange(Q3DAbstractAxis::AxisOrientation orientation, float min, float max) +void Abstract3DRenderer::updateAxisRange(QAbstract3DAxis::AxisOrientation orientation, + float min, float max) { AxisRenderCache &cache = axisCacheForOrientation(orientation); cache.setMin(min); cache.setMax(max); } -void Abstract3DRenderer::updateAxisSegmentCount(Q3DAbstractAxis::AxisOrientation orientation, int count) +void Abstract3DRenderer::updateAxisSegmentCount(QAbstract3DAxis::AxisOrientation orientation, + int count) { axisCacheForOrientation(orientation).setSegmentCount(count); } -void Abstract3DRenderer::updateAxisSubSegmentCount(Q3DAbstractAxis::AxisOrientation orientation, int count) +void Abstract3DRenderer::updateAxisSubSegmentCount(QAbstract3DAxis::AxisOrientation orientation, + int count) { axisCacheForOrientation(orientation).setSubSegmentCount(count); } -void Abstract3DRenderer::updateAxisLabelFormat(Q3DAbstractAxis::AxisOrientation orientation, const QString &format) +void Abstract3DRenderer::updateAxisLabelFormat(QAbstract3DAxis::AxisOrientation orientation, + const QString &format) { axisCacheForOrientation(orientation).setLabelFormat(format); } @@ -348,19 +361,26 @@ void Abstract3DRenderer::updateSeries(const QList<QAbstract3DSeries *> &seriesLi visibleCount = 0; } foreach (QAbstract3DSeries *current, seriesList) { - if (current->isVisible()) + if (current->isVisible()) { + // Item selection label may need update + if (current->d_ptr->m_changeTracker.nameChanged + || current->d_ptr->m_changeTracker.itemLabelFormatChanged) { + m_selectionLabelDirty = true; + } m_visibleSeriesList[visibleCount++].populate(current, this); + } } } -AxisRenderCache &Abstract3DRenderer::axisCacheForOrientation(Q3DAbstractAxis::AxisOrientation orientation) +AxisRenderCache &Abstract3DRenderer::axisCacheForOrientation( + QAbstract3DAxis::AxisOrientation orientation) { switch (orientation) { - case Q3DAbstractAxis::AxisOrientationX: + case QAbstract3DAxis::AxisOrientationX: return m_axisCacheX; - case Q3DAbstractAxis::AxisOrientationY: + case QAbstract3DAxis::AxisOrientationY: return m_axisCacheY; - case Q3DAbstractAxis::AxisOrientationZ: + case QAbstract3DAxis::AxisOrientationZ: return m_axisCacheZ; default: qFatal("Abstract3DRenderer::axisCacheForOrientation"); @@ -370,32 +390,32 @@ AxisRenderCache &Abstract3DRenderer::axisCacheForOrientation(Q3DAbstractAxis::Ax void Abstract3DRenderer::lowerShadowQuality() { - QDataVis::ShadowQuality newQuality = QDataVis::ShadowQualityNone; + QAbstract3DGraph::ShadowQuality newQuality = QAbstract3DGraph::ShadowQualityNone; switch (m_cachedShadowQuality) { - case QDataVis::ShadowQualityHigh: + case QAbstract3DGraph::ShadowQualityHigh: qWarning("Creating high quality shadows failed. Changing to medium quality."); - newQuality = QDataVis::ShadowQualityMedium; + newQuality = QAbstract3DGraph::ShadowQualityMedium; break; - case QDataVis::ShadowQualityMedium: + case QAbstract3DGraph::ShadowQualityMedium: qWarning("Creating medium quality shadows failed. Changing to low quality."); - newQuality = QDataVis::ShadowQualityLow; + newQuality = QAbstract3DGraph::ShadowQualityLow; break; - case QDataVis::ShadowQualityLow: + case QAbstract3DGraph::ShadowQualityLow: qWarning("Creating low quality shadows failed. Switching shadows off."); - newQuality = QDataVis::ShadowQualityNone; + newQuality = QAbstract3DGraph::ShadowQualityNone; break; - case QDataVis::ShadowQualitySoftHigh: + case QAbstract3DGraph::ShadowQualitySoftHigh: qWarning("Creating soft high quality shadows failed. Changing to soft medium quality."); - newQuality = QDataVis::ShadowQualitySoftMedium; + newQuality = QAbstract3DGraph::ShadowQualitySoftMedium; break; - case QDataVis::ShadowQualitySoftMedium: + case QAbstract3DGraph::ShadowQualitySoftMedium: qWarning("Creating soft medium quality shadows failed. Changing to soft low quality."); - newQuality = QDataVis::ShadowQualitySoftLow; + newQuality = QAbstract3DGraph::ShadowQualitySoftLow; break; - case QDataVis::ShadowQualitySoftLow: + case QAbstract3DGraph::ShadowQualitySoftLow: qWarning("Creating soft low quality shadows failed. Switching shadows off."); - newQuality = QDataVis::ShadowQualityNone; + newQuality = QAbstract3DGraph::ShadowQualityNone; break; default: // You'll never get here @@ -406,7 +426,8 @@ void Abstract3DRenderer::lowerShadowQuality() updateShadowQuality(newQuality); } -void Abstract3DRenderer::fixGradientAndGenerateTexture(QLinearGradient *gradient, GLuint *gradientTexture) +void Abstract3DRenderer::fixGradientAndGenerateTexture(QLinearGradient *gradient, + GLuint *gradientTexture) { // Readjust start/stop to match gradient texture size gradient->setStart(qreal(gradientTextureWidth), qreal(gradientTextureHeight)); @@ -420,4 +441,4 @@ void Abstract3DRenderer::fixGradientAndGenerateTexture(QLinearGradient *gradient *gradientTexture = m_textureHelper->createGradientTexture(*gradient); } -QT_DATAVISUALIZATION_END_NAMESPACE +QT_END_NAMESPACE_DATAVISUALIZATION |