summaryrefslogtreecommitdiffstats
path: root/src/datavisualization/engine
diff options
context:
space:
mode:
authorKeränen Pasi <pasi.keranen@digia.com>2013-11-12 09:24:56 +0200
committerPasi Keränen <pasi.keranen@digia.com>2013-11-15 12:35:06 +0200
commitcc22cc40e889b5b2f0e49ce32f660395cef865b7 (patch)
tree03bb5365bbfc614cfb94ffe304e632eb16ce5493 /src/datavisualization/engine
parent999ffa01d20f75a457da62d41c0fabfc32e5e1bb (diff)
Changes scene to be proxy for input position and selection communication.
Change-Id: I83729508c8a0281569be5f43791d44d36d800ca2 Reviewed-by: Miikka Heikkinen <miikka.heikkinen@digia.com>
Diffstat (limited to 'src/datavisualization/engine')
-rw-r--r--src/datavisualization/engine/abstract3dcontroller.cpp26
-rw-r--r--src/datavisualization/engine/abstract3dcontroller_p.h6
-rw-r--r--src/datavisualization/engine/abstract3drenderer.cpp26
-rw-r--r--src/datavisualization/engine/abstract3drenderer_p.h11
-rw-r--r--src/datavisualization/engine/bars3drenderer.cpp19
-rw-r--r--src/datavisualization/engine/bars3drenderer_p.h2
-rw-r--r--src/datavisualization/engine/q3dscene.cpp37
-rw-r--r--src/datavisualization/engine/q3dscene.h12
-rw-r--r--src/datavisualization/engine/q3dscene_p.h5
-rw-r--r--src/datavisualization/engine/scatter3drenderer.cpp19
-rw-r--r--src/datavisualization/engine/scatter3drenderer_p.h2
-rw-r--r--src/datavisualization/engine/surface3drenderer.cpp19
-rw-r--r--src/datavisualization/engine/surface3drenderer_p.h1
13 files changed, 86 insertions, 99 deletions
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
@@ -178,6 +178,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
*
* This property contains whether 2D slicing view is currently active or not.
@@ -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<Q3DScenePrivate> 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<QAbstract3DSeries *> &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<QAbstract3DSeries *> &seriesList);
void updateScene(Q3DScene *scene);
- void updateInputState(QDataVis::InputState state);
bool updateSmoothStatus(bool enable);
void updateSurfaceGridStatus(bool enable);
void updateSurfaceGradient(const QLinearGradient &gradient);