diff options
author | Miikka Heikkinen <miikka.heikkinen@digia.com> | 2013-10-30 13:22:05 +0200 |
---|---|---|
committer | Miikka Heikkinen <miikka.heikkinen@digia.com> | 2013-10-31 08:05:46 +0200 |
commit | 23c544c4881a5b72fef9d02c40a81cf894ac3309 (patch) | |
tree | 38b1771c44d057a553cc4c808f9237f11c6d434e /src/datavisualization | |
parent | 1eefb471180746dda5882344deecd750305fea21 (diff) |
Cleaning controller callbacks from renderers, part 1
Input state and position via synchronization
Task-number: QTRD-2216
Change-Id: If53530aa9f65a8668fb628ba86d367149a62e64f
Reviewed-by: Tomi Korpipää <tomi.korpipaa@digia.com>
Diffstat (limited to 'src/datavisualization')
11 files changed, 101 insertions, 62 deletions
diff --git a/src/datavisualization/engine/abstract3dcontroller.cpp b/src/datavisualization/engine/abstract3dcontroller.cpp index 5a9d8a7a..f1e1d27c 100644 --- a/src/datavisualization/engine/abstract3dcontroller.cpp +++ b/src/datavisualization/engine/abstract3dcontroller.cpp @@ -64,6 +64,8 @@ Abstract3DController::Abstract3DController(QRect boundRect, QObject *parent) : setActiveInputHandler(inputHandler); connect(inputHandler, &QAbstract3DInputHandler::inputStateChanged, this, &Abstract3DController::handleInputStateChanged); + connect(inputHandler, &QAbstract3DInputHandler::positionChanged, this, + &Abstract3DController::handleInputPositionChanged); connect(m_scene, &Q3DScene::needRender, this, &Abstract3DController::emitNeedRender); } @@ -102,6 +104,16 @@ void Abstract3DController::synchDataToRenderer() m_renderer->updateScene(m_scene); + if (m_changeTracker.inputPositionChanged) { + m_renderer->updateInputPosition(inputPosition()); + m_changeTracker.inputPositionChanged = false; + } + + if (m_changeTracker.inputStateChanged) { + m_renderer->updateInputState(inputState()); + m_changeTracker.inputStateChanged = false; + } + if (m_changeTracker.themeChanged) { m_renderer->updateTheme(m_theme); m_changeTracker.themeChanged = false; @@ -794,7 +806,7 @@ QPoint Abstract3DController::inputPosition() if (m_activeInputHandler) return m_activeInputHandler->inputPosition(); else - return QPoint(0,0); + return QPoint(0, 0); } void Abstract3DController::setMeshFileName(const QString &fileName) @@ -936,6 +948,16 @@ void Abstract3DController::handleInputStateChanged(QDataVis::InputState state) && state == QDataVis::InputStateOnOverview) { setSlicingActive(false); } + + m_changeTracker.inputStateChanged = true; + emitNeedRender(); +} + +void Abstract3DController::handleInputPositionChanged(const QPoint &position) +{ + Q_UNUSED(position) + + m_changeTracker.inputPositionChanged = true; emitNeedRender(); } diff --git a/src/datavisualization/engine/abstract3dcontroller_p.h b/src/datavisualization/engine/abstract3dcontroller_p.h index dd5a56ce..e6ea33eb 100644 --- a/src/datavisualization/engine/abstract3dcontroller_p.h +++ b/src/datavisualization/engine/abstract3dcontroller_p.h @@ -81,6 +81,8 @@ struct Abstract3DChangeBitField { bool axisXLabelFormatChanged : 1; bool axisYLabelFormatChanged : 1; bool axisZLabelFormatChanged : 1; + bool inputStateChanged : 1; + bool inputPositionChanged : 1; Abstract3DChangeBitField() : positionChanged(true), @@ -115,7 +117,9 @@ struct Abstract3DChangeBitField { axisZSubSegmentCountChanged(true), axisXLabelFormatChanged(true), axisYLabelFormatChanged(true), - axisZLabelFormatChanged(true) + axisZLabelFormatChanged(true), + inputStateChanged(true), + inputPositionChanged(true) { } }; @@ -154,7 +158,6 @@ private: bool m_isBackgroundEnabled; bool m_isGridEnabled; QString m_objFile; - Q3DScene *m_scene; protected: @@ -281,7 +284,6 @@ public: bool isSlicingActive(); void setSlicingActive(bool isSlicing); - // override bar type with own mesh virtual void setMeshFileName(const QString &fileName); virtual QString meshFileName(); @@ -313,6 +315,7 @@ public slots: void handleAxisAutoAdjustRangeChanged(bool autoAdjust); void handleAxisLabelFormatChanged(const QString &format); void handleInputStateChanged(QDataVis::InputState state); + void handleInputPositionChanged(const QPoint &position); signals: void shadowQualityChanged(QDataVis::ShadowQuality quality); diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp index a11363a9..27820067 100644 --- a/src/datavisualization/engine/abstract3drenderer.cpp +++ b/src/datavisualization/engine/abstract3drenderer.cpp @@ -41,7 +41,8 @@ Abstract3DRenderer::Abstract3DRenderer(Abstract3DController *controller) m_cachedIsGridEnabled(false), m_cachedIsBackgroundEnabled(false), m_cachedScene(new Q3DScene()), - m_selectionDirty(true) + m_selectionDirty(true), + m_inputState(QDataVis::InputStateNone) #ifdef DISPLAY_RENDER_SPEED , m_isFirstFrame(true), m_numFrames(0) @@ -137,6 +138,16 @@ QString Abstract3DRenderer::itemLabelFormat() const return m_cachedItemLabelFormat; } +void Abstract3DRenderer::updateInputState(QDataVis::InputState state) +{ + m_inputState = state; +} + +void Abstract3DRenderer::updateInputPosition(const QPoint &position) +{ + m_inputPosition = position; +} + void Abstract3DRenderer::updateBoundingRect(const QRect &boundingRect) { m_cachedBoundingRect = boundingRect; diff --git a/src/datavisualization/engine/abstract3drenderer_p.h b/src/datavisualization/engine/abstract3drenderer_p.h index b3ee6eac..718d318a 100644 --- a/src/datavisualization/engine/abstract3drenderer_p.h +++ b/src/datavisualization/engine/abstract3drenderer_p.h @@ -80,6 +80,8 @@ protected: Q3DScene *m_cachedScene; bool m_selectionDirty; + QDataVis::InputState m_inputState; + QPoint m_inputPosition; #ifdef DISPLAY_RENDER_SPEED bool m_isFirstFrame; @@ -110,6 +112,8 @@ public: virtual QString itemLabelFormat() const; virtual void updateTextures() = 0; virtual void initSelectionBuffer() = 0; + virtual void updateInputState(QDataVis::InputState state); + virtual void updateInputPosition(const QPoint &position); #if !defined(QT_OPENGL_ES_2) virtual void updateDepthBuffer() = 0; diff --git a/src/datavisualization/engine/bars3drenderer.cpp b/src/datavisualization/engine/bars3drenderer.cpp index 0f24c995..2d018383 100644 --- a/src/datavisualization/engine/bars3drenderer.cpp +++ b/src/datavisualization/engine/bars3drenderer.cpp @@ -50,7 +50,6 @@ Bars3DRenderer::Bars3DRenderer(Bars3DController *controller) m_cachedIsSlicingActivated(false), m_cachedRowCount(0), m_cachedColumnCount(0), - m_cachedInputState(QDataVis::InputStateNone), m_selectedBar(0), m_sliceSelection(0), m_sliceCache(0), @@ -247,15 +246,6 @@ void Bars3DRenderer::render(GLuint defaultFboHandle) { bool slicingChanged = m_cachedIsSlicingActivated != m_cachedScene->isSlicingActive(); - // TODO: Can't call back to controller here! (QTRD-2216) - // TODO: Needs to be added to synchronization - QDataVis::InputState currentInputState = m_controller->inputState(); - if (currentInputState != m_cachedInputState) { - if (currentInputState == QDataVis::InputStateOnScene) - m_clickedBarColor = invalidColorVector; - m_cachedInputState = currentInputState; - } - // Handle GL state setup for FBO buffers and clearing of the render surface Abstract3DRenderer::render(defaultFboHandle); @@ -355,7 +345,7 @@ void Bars3DRenderer::drawSlicedScene(const LabelItem &xLabel, if (m_visualSelectedBarPos.x() == item->position().x() && m_visualSelectedBarPos.y() == item->position().y()) { baseColor = barHighlightColor; - } else if (QDataVis::SelectionSliceRow == m_cachedSelectionMode) { + } else if (rowMode) { baseColor = rowHighlightColor; } else { baseColor = columnHighlightColor; @@ -679,7 +669,7 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) // TODO: Selection must be enabled currently to support clicked signal. (QTRD-2517) // Skip selection mode drawing if we're slicing or have no selection mode if (!m_cachedIsSlicingActivated && m_cachedSelectionMode > QDataVis::SelectionNone - && m_cachedInputState == QDataVis::InputStateOnScene) { + && m_inputState == QDataVis::InputStateOnScene) { // Bind selection shader m_selectionShader->bind(); @@ -748,8 +738,7 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) glEnable(GL_DITHER); // Read color under cursor - // TODO: Can't call back to controller here! (QTRD-2216) - QVector3D clickedColor = Utils::getSelection(m_controller->inputPosition(), + QVector3D clickedColor = Utils::getSelection(m_inputPosition, m_cachedBoundingRect.height()); if (m_clickedBarColor == invalidColorVector) { m_clickedBarColor = clickedColor; @@ -1609,6 +1598,17 @@ void Bars3DRenderer::updateSelectedBar(const QPoint &position) m_selectionDirty = true; } +void Bars3DRenderer::updateInputState(QDataVis::InputState state) +{ + QDataVis::InputState oldInputState = m_inputState; + + Abstract3DRenderer::updateInputState(state); + + // Clear clicked color on input state change + if (oldInputState != m_inputState && m_inputState == QDataVis::InputStateOnScene) + m_clickedBarColor = invalidColorVector; +} + void Bars3DRenderer::updateShadowQuality(QDataVis::ShadowQuality quality) { m_cachedShadowQuality = quality; diff --git a/src/datavisualization/engine/bars3drenderer_p.h b/src/datavisualization/engine/bars3drenderer_p.h index 5d186a7d..1d3d0896 100644 --- a/src/datavisualization/engine/bars3drenderer_p.h +++ b/src/datavisualization/engine/bars3drenderer_p.h @@ -60,7 +60,6 @@ private: bool m_cachedIsSlicingActivated; int m_cachedRowCount; int m_cachedColumnCount; - QDataVis::InputState m_cachedInputState; // Internal state BarRenderItem *m_selectedBar; // points to renderitem array @@ -129,6 +128,7 @@ public slots: void updateSlicingActive(bool isSlicing); void updateBackgroundEnabled(bool enable); void updateSelectedBar(const QPoint &position); + void updateInputState(QDataVis::InputState state); // Overloaded from abstract renderer virtual void updateAxisRange(Q3DAbstractAxis::AxisOrientation orientation, qreal min, qreal max); diff --git a/src/datavisualization/engine/scatter3drenderer.cpp b/src/datavisualization/engine/scatter3drenderer.cpp index 75440cdc..ed69d88d 100644 --- a/src/datavisualization/engine/scatter3drenderer.cpp +++ b/src/datavisualization/engine/scatter3drenderer.cpp @@ -80,8 +80,7 @@ Scatter3DRenderer::Scatter3DRenderer(Scatter3DController *controller) m_clickedColor(invalidColorVector), m_areaSize(QSizeF(0.0, 0.0)), m_dotSizeScale(1.0f), - m_hasHeightAdjustmentChanged(true), - m_cachedInputState(QDataVis::InputStateNone) + m_hasHeightAdjustmentChanged(true) { initializeOpenGLFunctions(); initializeOpenGL(); @@ -192,17 +191,19 @@ void Scatter3DRenderer::updateScene(Q3DScene *scene) Abstract3DRenderer::updateScene(scene); } -void Scatter3DRenderer::render(GLuint defaultFboHandle) +void Scatter3DRenderer::updateInputState(QDataVis::InputState state) { - // TODO: Can't call back to controller here! (QTRD-2216) - // TODO: Needs to be added to synchronization - QDataVis::InputState currentInputState = m_controller->inputState(); - if (currentInputState != m_cachedInputState) { - if (currentInputState == QDataVis::InputStateOnScene) - m_clickedColor = invalidColorVector; - m_cachedInputState = currentInputState; - } + QDataVis::InputState oldInputState = m_inputState; + + Abstract3DRenderer::updateInputState(state); + // Clear clicked color on input state change + if (oldInputState != m_inputState && m_inputState == QDataVis::InputStateOnScene) + m_clickedColor = invalidColorVector; +} + +void Scatter3DRenderer::render(GLuint defaultFboHandle) +{ // Handle GL state setup for FBO buffers and clearing of the render surface Abstract3DRenderer::render(defaultFboHandle); @@ -386,7 +387,7 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) // Skip selection mode drawing if we have no selection mode // TODO: Can't call back to controller here! (QTRD-2216) if (m_cachedSelectionMode > QDataVis::SelectionNone - && QDataVis::InputStateOnScene == m_controller->inputState()) { + && QDataVis::InputStateOnScene == m_inputState) { // Bind selection shader m_selectionShader->bind(); @@ -444,7 +445,7 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) // Read color under cursor // TODO: Can't call back to controller here! (QTRD-2216) - QVector3D clickedColor = Utils::getSelection(m_controller->inputPosition(), + QVector3D clickedColor = Utils::getSelection(m_inputPosition, m_cachedBoundingRect.height()); if (m_clickedColor == invalidColorVector) { m_clickedColor = clickedColor; diff --git a/src/datavisualization/engine/scatter3drenderer_p.h b/src/datavisualization/engine/scatter3drenderer_p.h index 4a1f0b30..2f98deaf 100644 --- a/src/datavisualization/engine/scatter3drenderer_p.h +++ b/src/datavisualization/engine/scatter3drenderer_p.h @@ -91,17 +91,16 @@ private: bool m_hasHeightAdjustmentChanged; ScatterRenderItem m_dummyRenderItem; - ScatterRenderItemArray m_renderItemArray; - QDataVis::InputState m_cachedInputState; - public: explicit Scatter3DRenderer(Scatter3DController *controller); ~Scatter3DRenderer(); void updateDataModel(QScatterDataProxy *dataProxy); void updateScene(Q3DScene *scene); + void updateInputState(QDataVis::InputState state); + void render(GLuint defaultFboHandle); QRect mainViewPort(); diff --git a/src/datavisualization/engine/surface3drenderer.cpp b/src/datavisualization/engine/surface3drenderer.cpp index d79b5677..1ebdac57 100644 --- a/src/datavisualization/engine/surface3drenderer.cpp +++ b/src/datavisualization/engine/surface3drenderer.cpp @@ -65,7 +65,6 @@ Surface3DRenderer::Surface3DRenderer(Surface3DController *controller) m_font(QFont(QStringLiteral("Arial"))), m_isGridEnabled(true), m_cachedIsSlicingActivated(false), - m_cachedInputState(QDataVis::InputStateNone), m_shader(0), m_depthShader(0), m_backgroundShader(0), @@ -440,19 +439,21 @@ void Surface3DRenderer::updateScene(Q3DScene *scene) updateSlicingActive(scene->isSlicingActive()); } +void Surface3DRenderer::updateInputState(QDataVis::InputState state) +{ + QDataVis::InputState oldInputState = m_inputState; + + Abstract3DRenderer::updateInputState(state); + + // Clear clicked color on input state change + if (oldInputState != m_inputState && m_inputState == QDataVis::InputStateOnScene) + m_clickedPointId = invalidSelectionId; +} + void Surface3DRenderer::render(GLuint defaultFboHandle) { bool slicingChanged = m_cachedIsSlicingActivated != m_cachedScene->isSlicingActive(); - // TODO: Can't call back to controller here! (QTRD-2216) - // TODO: Needs to be added to synchronization - QDataVis::InputState currentInputState = m_controller->inputState(); - if (currentInputState != m_cachedInputState) { - if (currentInputState == QDataVis::InputStateOnScene) - m_clickedPointId = invalidSelectionId; - m_cachedInputState = currentInputState; - } - // Handle GL state setup for FBO buffers and clearing of the render surface Abstract3DRenderer::render(defaultFboHandle); @@ -897,7 +898,7 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) glEnable(GL_TEXTURE_2D); // Draw selection buffer - if (!m_cachedIsSlicingActivated && m_surfaceObj && m_cachedInputState == QDataVis::InputStateOnScene + if (!m_cachedIsSlicingActivated && m_surfaceObj && m_inputState == QDataVis::InputStateOnScene && m_cachedSelectionMode > QDataVis::SelectionNone) { m_selectionShader->bind(); glBindFramebuffer(GL_FRAMEBUFFER, m_selectionFrameBuffer); @@ -922,10 +923,9 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) glEnable(GL_DITHER); - QPoint point = m_controller->inputPosition(); GLubyte pixel[4] = {0}; - glReadPixels(point.x(), m_cachedBoundingRect.height() - point.y(), 1, 1, - GL_RGBA, GL_UNSIGNED_BYTE, (void *)pixel); + glReadPixels(m_inputPosition.x(), m_cachedBoundingRect.height() - m_inputPosition.y(), + 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, (void *)pixel); glBindFramebuffer(GL_FRAMEBUFFER, defaultFboHandle); diff --git a/src/datavisualization/engine/surface3drenderer_p.h b/src/datavisualization/engine/surface3drenderer_p.h index 72a83692..c7d41ac3 100644 --- a/src/datavisualization/engine/surface3drenderer_p.h +++ b/src/datavisualization/engine/surface3drenderer_p.h @@ -70,7 +70,6 @@ public: private: bool m_cachedIsSlicingActivated; - QDataVis::InputState m_cachedInputState; // Internal attributes purely related to how the scene is drawn with GL. QRect m_mainViewPort; @@ -135,6 +134,13 @@ public: void updateDataModel(QSurfaceDataProxy *dataProxy); void updateScene(Q3DScene *scene); + void updateInputState(QDataVis::InputState state); + bool updateSmoothStatus(bool enable); + void updateSurfaceGridStatus(bool enable); + void updateSurfaceGradient(const QLinearGradient &gradient); + void updateSlicingActive(bool isSlicing); + void updateSelectedPoint(const QPoint &position); + void drawSlicedScene(); void render(GLuint defaultFboHandle = 0); @@ -142,22 +148,15 @@ protected: void initializeOpenGL(); virtual void loadMeshFile(); -public slots: - bool updateSmoothStatus(bool enable); - void updateSurfaceGridStatus(bool enable); - void updateSurfaceGradient(const QLinearGradient &gradient); - void updateSlicingActive(bool isSlicing); - void updateSelectedPoint(const QPoint &position); - signals: void pointClicked(QPoint position); private: void setViewPorts(); void updateSliceDataModel(const QPoint &point); - virtual void updateShadowQuality(QDataVis::ShadowQuality quality); - virtual void updateTextures(); - virtual void initShaders(const QString &vertexShader, const QString &fragmentShader); + void updateShadowQuality(QDataVis::ShadowQuality quality); + void updateTextures(); + void initShaders(const QString &vertexShader, const QString &fragmentShader); QRect calculateSampleRect(const QSurfaceDataArray &array); void loadBackgroundMesh(); void loadGridLineMesh(); diff --git a/src/datavisualization/input/qabstract3dinputhandler.h b/src/datavisualization/input/qabstract3dinputhandler.h index d7bf3aee..fed6e3e0 100644 --- a/src/datavisualization/input/qabstract3dinputhandler.h +++ b/src/datavisualization/input/qabstract3dinputhandler.h @@ -58,7 +58,7 @@ public: void setScene(Q3DScene *scene); signals: - void positionChanged(const QPoint &position); + void positionChanged(QPoint position); void inputStateChanged(QDataVis::InputState state); void sceneChanged(const Q3DScene *scene); |