From cc22cc40e889b5b2f0e49ce32f660395cef865b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kera=CC=88nen=20Pasi?= Date: Tue, 12 Nov 2013 09:24:56 +0200 Subject: Changes scene to be proxy for input position and selection communication. Change-Id: I83729508c8a0281569be5f43791d44d36d800ca2 Reviewed-by: Miikka Heikkinen --- .../engine/abstract3dcontroller.cpp | 26 --------------- .../engine/abstract3dcontroller_p.h | 6 ---- .../engine/abstract3drenderer.cpp | 26 +++++++++++++-- .../engine/abstract3drenderer_p.h | 11 +++++-- src/datavisualization/engine/bars3drenderer.cpp | 19 ++--------- src/datavisualization/engine/bars3drenderer_p.h | 2 -- src/datavisualization/engine/q3dscene.cpp | 37 ++++++++++++++++++++-- src/datavisualization/engine/q3dscene.h | 12 +++++-- src/datavisualization/engine/q3dscene_p.h | 5 ++- src/datavisualization/engine/scatter3drenderer.cpp | 19 ++--------- src/datavisualization/engine/scatter3drenderer_p.h | 2 -- src/datavisualization/engine/surface3drenderer.cpp | 19 ++--------- src/datavisualization/engine/surface3drenderer_p.h | 1 - 13 files changed, 86 insertions(+), 99 deletions(-) (limited to 'src/datavisualization/engine') diff --git a/src/datavisualization/engine/abstract3dcontroller.cpp b/src/datavisualization/engine/abstract3dcontroller.cpp index c1f3a4b7..cfc05166 100644 --- a/src/datavisualization/engine/abstract3dcontroller.cpp +++ b/src/datavisualization/engine/abstract3dcontroller.cpp @@ -134,16 +134,6 @@ 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; - } - // TODO: Renderer doesn't need to know the theme, so remove this bit entirely (QTRD-2538) if (m_changeTracker.themeChanged) { m_renderer->updateTheme(m_theme); @@ -918,22 +908,6 @@ void Abstract3DController::setSlicingActive(bool isSlicing) emitNeedRender(); } -QDataVis::InputState Abstract3DController::inputState() -{ - if (m_activeInputHandler) - return m_activeInputHandler->inputState(); - else - return QDataVis::InputStateNone; -} - -QPoint Abstract3DController::inputPosition() -{ - if (m_activeInputHandler) - return m_activeInputHandler->inputPosition(); - else - return QPoint(0, 0); -} - void Abstract3DController::setMeshFileName(const QString &fileName) { if (fileName != m_objFile) { diff --git a/src/datavisualization/engine/abstract3dcontroller_p.h b/src/datavisualization/engine/abstract3dcontroller_p.h index 39e0abe6..6f7112b7 100644 --- a/src/datavisualization/engine/abstract3dcontroller_p.h +++ b/src/datavisualization/engine/abstract3dcontroller_p.h @@ -127,8 +127,6 @@ struct Abstract3DChangeBitField { axisXLabelFormatChanged(true), axisYLabelFormatChanged(true), axisZLabelFormatChanged(true), - inputStateChanged(true), - inputPositionChanged(true), // Items that override values from theme default to false since we default to theme colorStyleChanged(false), objectColorChanged(false), @@ -298,10 +296,6 @@ public: virtual void setGridEnabled(bool enable); virtual bool gridEnabled(); - // Query input state and position - QDataVis::InputState inputState(); - QPoint inputPosition(); - // Enable or disable slicing mode bool isSlicingActive(); void setSlicingActive(bool isSlicing); diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp index f639c6e3..1446d39a 100644 --- a/src/datavisualization/engine/abstract3drenderer.cpp +++ b/src/datavisualization/engine/abstract3drenderer.cpp @@ -49,7 +49,7 @@ Abstract3DRenderer::Abstract3DRenderer(Abstract3DController *controller) m_textureHelper(0), m_cachedScene(new Q3DScene()), m_selectionDirty(true), - m_inputState(QDataVis::InputStateNone) + m_selectionState(SelectNone) #ifdef DISPLAY_RENDER_SPEED , m_isFirstFrame(true), m_numFrames(0) @@ -148,9 +148,9 @@ QString Abstract3DRenderer::itemLabelFormat() const return m_cachedItemLabelFormat; } -void Abstract3DRenderer::updateInputState(QDataVis::InputState state) +void Abstract3DRenderer::updateSelectionState(SelectionState state) { - m_inputState = state; + m_selectionState = state; } void Abstract3DRenderer::updateInputPosition(const QPoint &position) @@ -181,6 +181,26 @@ void Abstract3DRenderer::updateTheme(Theme theme) void Abstract3DRenderer::updateScene(Q3DScene *scene) { + updateInputPosition(scene->selectionQueryPosition()); + + if (Q3DScene::noSelectionPoint() == scene->selectionQueryPosition()) { + updateSelectionState(SelectNone); + } else { + // Selections are one-shot, reset selection active to false before processing + scene->setSelectionQueryPosition(Q3DScene::noSelectionPoint()); + + if (scene->isSlicingActive()) { + if (scene->isPointInPrimarySubView(m_inputPosition)) + updateSelectionState(SelectOnOverview); + else if (scene->isPointInSecondarySubView(m_inputPosition)) + updateSelectionState(SelectOnSlice); + else + updateSelectionState(SelectNone); + } else { + updateSelectionState(SelectOnScene); + } + } + // Synchronize the controller scene to that of the renderer, and vice versa. // Controller scene had priority if both have changed same values. scene->d_ptr->sync(*m_cachedScene->d_ptr); diff --git a/src/datavisualization/engine/abstract3drenderer_p.h b/src/datavisualization/engine/abstract3drenderer_p.h index 3c833956..24d42e37 100644 --- a/src/datavisualization/engine/abstract3drenderer_p.h +++ b/src/datavisualization/engine/abstract3drenderer_p.h @@ -51,6 +51,13 @@ class Abstract3DRenderer : public QObject, protected QOpenGLFunctions Q_OBJECT protected: + enum SelectionState { + SelectNone = 0, + SelectOnScene, + SelectOnOverview, + SelectOnSlice + }; + bool m_hasNegativeValues; Theme m_cachedTheme; QFont m_cachedFont; @@ -85,7 +92,7 @@ protected: Q3DScene *m_cachedScene; bool m_selectionDirty; - QDataVis::InputState m_inputState; + SelectionState m_selectionState; QPoint m_inputPosition; #ifdef DISPLAY_RENDER_SPEED @@ -117,7 +124,7 @@ public: virtual QString itemLabelFormat() const; virtual void updateTextures() = 0; virtual void initSelectionBuffer() = 0; - virtual void updateInputState(QDataVis::InputState state); + virtual void updateSelectionState(SelectionState state); virtual void updateInputPosition(const QPoint &position); #if !defined(QT_OPENGL_ES_2) diff --git a/src/datavisualization/engine/bars3drenderer.cpp b/src/datavisualization/engine/bars3drenderer.cpp index c7dac4f9..23932f23 100644 --- a/src/datavisualization/engine/bars3drenderer.cpp +++ b/src/datavisualization/engine/bars3drenderer.cpp @@ -87,7 +87,6 @@ Bars3DRenderer::Bars3DRenderer(Bars3DController *controller) m_scaleFactor(0), m_maxSceneSize(40.0f), m_visualSelectedBarPos(Bars3DController::noSelectionPoint()), - m_clickedBarColor(invalidColorVector), m_hasHeightAdjustmentChanged(true), m_selectedBarPos(Bars3DController::noSelectionPoint()), m_noZeroInRange(false), @@ -868,7 +867,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_inputState == QDataVis::InputStateOnScene) { + && m_selectionState == SelectOnScene) { // Bind selection shader m_selectionShader->bind(); @@ -947,10 +946,7 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) // Read color under cursor QVector3D clickedColor = Utils::getSelection(m_inputPosition, m_cachedBoundingRect.height()); - if (m_clickedBarColor == invalidColorVector) { - m_clickedBarColor = clickedColor; - emit barClicked(selectionColorToArrayPosition(m_clickedBarColor)); - } + emit barClicked(selectionColorToArrayPosition(clickedColor)); glBindFramebuffer(GL_FRAMEBUFFER, defaultFboHandle); @@ -1857,17 +1853,6 @@ void Bars3DRenderer::updateSelectedBar(const QPoint &position) } } -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 98fdf92e..5424c096 100644 --- a/src/datavisualization/engine/bars3drenderer_p.h +++ b/src/datavisualization/engine/bars3drenderer_p.h @@ -99,7 +99,6 @@ private: QPoint m_visualSelectedBarPos; // The selection id color int m_renderRows; int m_renderColumns; - QVector3D m_clickedBarColor; bool m_hasHeightAdjustmentChanged; QPoint m_selectedBarPos; BarRenderItem m_dummyBarRenderItem; @@ -131,7 +130,6 @@ 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/q3dscene.cpp b/src/datavisualization/engine/q3dscene.cpp index 70c8ffd6..3cda41b7 100644 --- a/src/datavisualization/engine/q3dscene.cpp +++ b/src/datavisualization/engine/q3dscene.cpp @@ -177,6 +177,34 @@ void Q3DScene::setSecondarySubViewport(const QRect &secondarySubViewport) } } +/*! + * \property Q3DScene::selectionQueryPosition + * This property contains the coordinates for the user input that should be processed + * by the scene as selection. If this is set to value other than Q3DScene()::noSelectionPoint() the + * graph tries to select a data item at the given \a point within the main viewport. + * After the rendering pass the property is returned to its default state of Q3DScene()::noSelectionPoint(). + */ +void Q3DScene::setSelectionQueryPosition(const QPoint &point) +{ + if (point != d_ptr->m_selectionQueryPosition) { + d_ptr->m_selectionQueryPosition = point; + d_ptr->m_changeTracker.selectionQueryPositionChanged = true; + emit selectionQueryPositionChanged(point); + emitNeedRender(); + } +} + +QPoint Q3DScene::selectionQueryPosition() const +{ + return d_ptr->m_selectionQueryPosition; +} + +const QPoint Q3DScene::noSelectionPoint() +{ + static const QPoint noSelectionPos(-1, -1); + return noSelectionPos; +} + /*! * \property Q3DScene::slicingActive * @@ -329,7 +357,6 @@ void Q3DScene::setLightPositionRelativeToCamera(const QVector3D &relativePositio * \fn Q3DScene::needRender() * \internal */ - Q3DScenePrivate::Q3DScenePrivate(Q3DScene *q) : q_ptr(q), m_isSecondarySubviewOnTop(true), @@ -337,7 +364,8 @@ Q3DScenePrivate::Q3DScenePrivate(Q3DScene *q) : m_camera(), m_light(), m_isUnderSideCameraEnabled(false), - m_isSlicingActive(false) + m_isSlicingActive(false), + m_selectionQueryPosition(Q3DScene::noSelectionPoint()) { } @@ -371,6 +399,11 @@ void Q3DScenePrivate::sync(Q3DScenePrivate &other) m_changeTracker.secondarySubViewportChanged = false; other.m_changeTracker.secondarySubViewportChanged = false; } + if (m_changeTracker.selectionQueryPositionChanged) { + other.q_ptr->setSelectionQueryPosition(q_ptr->selectionQueryPosition()); + m_changeTracker.selectionQueryPositionChanged = false; + other.m_changeTracker.selectionQueryPositionChanged = false; + } if (m_changeTracker.cameraChanged) { m_camera->setDirty(true); m_changeTracker.cameraChanged = false; diff --git a/src/datavisualization/engine/q3dscene.h b/src/datavisualization/engine/q3dscene.h index 94d82c8b..5f034687 100644 --- a/src/datavisualization/engine/q3dscene.h +++ b/src/datavisualization/engine/q3dscene.h @@ -36,6 +36,7 @@ class QT_DATAVISUALIZATION_EXPORT Q3DScene : public QObject Q_PROPERTY(QRect viewport READ viewport WRITE setViewport NOTIFY viewportChanged) Q_PROPERTY(QRect primarySubViewport READ primarySubViewport WRITE setPrimarySubViewport NOTIFY primarySubViewportChanged) Q_PROPERTY(QRect secondarySubViewport READ secondarySubViewport WRITE setSecondarySubViewport NOTIFY secondarySubViewportChanged) + Q_PROPERTY(QPoint selectionQueryPosition READ selectionQueryPosition WRITE setSelectionQueryPosition NOTIFY selectionQueryPositionChanged) Q_PROPERTY(bool secondarySubviewOnTop READ isSecondarySubviewOnTop WRITE setSecondarySubviewOnTop NOTIFY secondarySubviewOnTopChanged) Q_PROPERTY(bool slicingActive READ isSlicingActive WRITE setSlicingActive NOTIFY slicingActiveChanged) Q_PROPERTY(Q3DCamera* activeCamera READ activeCamera WRITE setActiveCamera NOTIFY activeCameraChanged) @@ -58,6 +59,10 @@ public: void setSecondarySubViewport(const QRect &secondarySubViewport); bool isPointInSecondarySubView(const QPoint &point); + void setSelectionQueryPosition(const QPoint &point); + QPoint selectionQueryPosition() const; + static const QPoint noSelectionPoint(); + void setSlicingActive(bool isSlicing); bool isSlicingActive() const; @@ -73,9 +78,9 @@ public: qreal devicePixelRatio() const; void setDevicePixelRatio(qreal pixelRatio); - void setLightPositionRelativeToCamera(const QVector3D &relativePosition, - qreal fixedRotation = 0.0, - qreal distanceModifier = 0.0); + Q_INVOKABLE void setLightPositionRelativeToCamera(const QVector3D &relativePosition, + qreal fixedRotation = 0.0, + qreal distanceModifier = 0.0); private: void emitNeedRender(); @@ -89,6 +94,7 @@ signals: void activeLightChanged(const Q3DLight *light); void devicePixelRatioChanged(qreal pixelRatio); void needRender(); + void selectionQueryPositionChanged(const QPoint position); private: QScopedPointer d_ptr; diff --git a/src/datavisualization/engine/q3dscene_p.h b/src/datavisualization/engine/q3dscene_p.h index 3610cbf4..4be4d745 100644 --- a/src/datavisualization/engine/q3dscene_p.h +++ b/src/datavisualization/engine/q3dscene_p.h @@ -47,6 +47,7 @@ struct Q3DSceneChangeBitField { bool lightChanged : 1; bool slicingActivatedChanged : 1; bool devicePixelRatioChanged : 1; + bool selectionQueryPositionChanged : 1; Q3DSceneChangeBitField() : viewportChanged(true), @@ -56,7 +57,8 @@ struct Q3DSceneChangeBitField { cameraChanged(true), lightChanged(true), slicingActivatedChanged(true), - devicePixelRatioChanged(true) + devicePixelRatioChanged(true), + selectionQueryPositionChanged(false) { } }; @@ -81,6 +83,7 @@ public: Q3DLight *m_light; bool m_isUnderSideCameraEnabled; bool m_isSlicingActive; + QPoint m_selectionQueryPosition; }; QT_DATAVISUALIZATION_END_NAMESPACE diff --git a/src/datavisualization/engine/scatter3drenderer.cpp b/src/datavisualization/engine/scatter3drenderer.cpp index e87c1435..311373da 100644 --- a/src/datavisualization/engine/scatter3drenderer.cpp +++ b/src/datavisualization/engine/scatter3drenderer.cpp @@ -80,7 +80,6 @@ Scatter3DRenderer::Scatter3DRenderer(Scatter3DController *controller) m_shadowQualityMultiplier(3), m_heightNormalizer(1.0f), m_scaleFactor(0), - m_clickedColor(invalidColorVector), m_areaSize(QSizeF(0.0, 0.0)), m_dotSizeScale(1.0f), m_hasHeightAdjustmentChanged(true), @@ -214,17 +213,6 @@ void Scatter3DRenderer::updateScene(Q3DScene *scene) Abstract3DRenderer::updateScene(scene); } -void Scatter3DRenderer::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_clickedColor = invalidColorVector; -} - void Scatter3DRenderer::render(GLuint defaultFboHandle) { // Handle GL state setup for FBO buffers and clearing of the render surface @@ -437,7 +425,7 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) // Skip selection mode drawing if we have no selection mode if (m_cachedSelectionMode > QDataVis::SelectionNone - && QDataVis::InputStateOnScene == m_inputState) { + && SelectOnScene == m_selectionState) { // Bind selection shader selectionShader->bind(); @@ -513,10 +501,7 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) // Read color under cursor QVector3D clickedColor = Utils::getSelection(m_inputPosition, m_cachedBoundingRect.height()); - if (m_clickedColor == invalidColorVector) { - m_clickedColor = clickedColor; - emit itemClicked(selectionColorToIndex(m_clickedColor)); - } + emit itemClicked(selectionColorToIndex(clickedColor)); glBindFramebuffer(GL_FRAMEBUFFER, defaultFboHandle); diff --git a/src/datavisualization/engine/scatter3drenderer_p.h b/src/datavisualization/engine/scatter3drenderer_p.h index 4050f89b..6513e571 100644 --- a/src/datavisualization/engine/scatter3drenderer_p.h +++ b/src/datavisualization/engine/scatter3drenderer_p.h @@ -81,7 +81,6 @@ private: GLint m_shadowQualityMultiplier; GLfloat m_heightNormalizer; GLfloat m_scaleFactor; - QVector3D m_clickedColor; int m_selectedItemIndex; QSizeF m_areaSize; GLfloat m_dotSizeScale; @@ -98,7 +97,6 @@ public: void updateSeriesData(const QList &seriesList); void updateScene(Q3DScene *scene); - void updateInputState(QDataVis::InputState state); void render(GLuint defaultFboHandle); diff --git a/src/datavisualization/engine/surface3drenderer.cpp b/src/datavisualization/engine/surface3drenderer.cpp index 3a6e3560..2ce1e345 100644 --- a/src/datavisualization/engine/surface3drenderer.cpp +++ b/src/datavisualization/engine/surface3drenderer.cpp @@ -448,17 +448,6 @@ 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) { // Handle GL state setup for FBO buffers and clearing of the render surface @@ -909,7 +898,7 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) glEnable(GL_TEXTURE_2D); // Draw selection buffer - if (!m_cachedIsSlicingActivated && m_surfaceObj && m_inputState == QDataVis::InputStateOnScene + if (!m_cachedIsSlicingActivated && m_surfaceObj && m_selectionState == SelectOnScene && m_cachedSelectionMode > QDataVis::SelectionNone && (m_cachedSurfaceVisible || m_cachedSurfaceGridOn)) { m_selectionShader->bind(); @@ -951,11 +940,7 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) uint selectionId = pixel[0] + pixel[1] * 256 + pixel[2] * 65536; #endif - if (m_clickedPointId == invalidSelectionId) { - m_clickedPointId = selectionId; - QPoint newPoint = selectionIdToSurfacePoint(m_clickedPointId); - emit pointClicked(newPoint); - } + emit pointClicked(QPoint(selectionIdToSurfacePoint(selectionId))); } // Draw the surface diff --git a/src/datavisualization/engine/surface3drenderer_p.h b/src/datavisualization/engine/surface3drenderer_p.h index 2c5f84fb..45222564 100644 --- a/src/datavisualization/engine/surface3drenderer_p.h +++ b/src/datavisualization/engine/surface3drenderer_p.h @@ -134,7 +134,6 @@ public: void updateSeriesData(const QList &seriesList); void updateScene(Q3DScene *scene); - void updateInputState(QDataVis::InputState state); bool updateSmoothStatus(bool enable); void updateSurfaceGridStatus(bool enable); void updateSurfaceGradient(const QLinearGradient &gradient); -- cgit v1.2.3