diff options
-rw-r--r-- | src/datavisualization/engine/abstract3dcontroller.cpp | 5 | ||||
-rw-r--r-- | src/datavisualization/engine/abstract3dcontroller_p.h | 1 | ||||
-rw-r--r-- | src/datavisualization/engine/q3dbars.cpp | 10 | ||||
-rw-r--r-- | src/datavisualization/engine/q3dbars.h | 1 | ||||
-rw-r--r-- | src/datavisualization/engine/q3dscatter.cpp | 10 | ||||
-rw-r--r-- | src/datavisualization/engine/q3dscatter.h | 1 | ||||
-rw-r--r-- | src/datavisualization/engine/q3dscene.cpp | 24 | ||||
-rw-r--r-- | src/datavisualization/engine/q3dscene.h | 4 | ||||
-rw-r--r-- | src/datavisualization/engine/q3dscene_p.h | 5 | ||||
-rw-r--r-- | src/datavisualization/engine/q3dsurface.cpp | 10 | ||||
-rw-r--r-- | src/datavisualization/engine/q3dsurface.h | 1 | ||||
-rw-r--r-- | src/datavisualization/engine/q3dwindow.cpp | 31 | ||||
-rw-r--r-- | src/datavisualization/engine/q3dwindow.h | 4 | ||||
-rw-r--r-- | src/datavisualization/engine/q3dwindow_p.h | 4 |
14 files changed, 77 insertions, 34 deletions
diff --git a/src/datavisualization/engine/abstract3dcontroller.cpp b/src/datavisualization/engine/abstract3dcontroller.cpp index b5bd04d5..4d02fc13 100644 --- a/src/datavisualization/engine/abstract3dcontroller.cpp +++ b/src/datavisualization/engine/abstract3dcontroller.cpp @@ -448,6 +448,11 @@ void Abstract3DController::setSecondarySubViewport(const QRect &secondarySubView m_scene->setSecondarySubViewport(secondarySubViewport); } +void Abstract3DController::updateDevicePixelRatio(qreal ratio) +{ + m_scene->setDevicePixelRatio(ratio); +} + void Abstract3DController::setAxisX(Q3DAbstractAxis *axis) { setAxisHelper(Q3DAbstractAxis::AxisOrientationX, axis, &m_axisX); diff --git a/src/datavisualization/engine/abstract3dcontroller_p.h b/src/datavisualization/engine/abstract3dcontroller_p.h index 1ad50f18..2c1867b1 100644 --- a/src/datavisualization/engine/abstract3dcontroller_p.h +++ b/src/datavisualization/engine/abstract3dcontroller_p.h @@ -235,6 +235,7 @@ public: virtual void releaseDataProxy(QAbstractDataProxy *proxy); virtual QList<QAbstractDataProxy *> dataProxies() const; virtual void setActiveDataProxy(QAbstractDataProxy *proxy); + virtual void updateDevicePixelRatio(qreal ratio); virtual int zoomLevel(); virtual void setZoomLevel(int zoomLevel); diff --git a/src/datavisualization/engine/q3dbars.cpp b/src/datavisualization/engine/q3dbars.cpp index a60fe190..701c82b9 100644 --- a/src/datavisualization/engine/q3dbars.cpp +++ b/src/datavisualization/engine/q3dbars.cpp @@ -242,6 +242,7 @@ QT_DATAVISUALIZATION_BEGIN_NAMESPACE Q3DBars::Q3DBars() : d_ptr(new Q3DBarsPrivate(this, geometry())) { + setVisualController(d_ptr->m_shared); d_ptr->m_shared->initializeOpenGL(); QObject::connect(d_ptr->m_shared, &Bars3DController::selectedBarPosChanged, this, &Q3DBars::selectedBarPosChanged); @@ -256,15 +257,6 @@ Q3DBars::~Q3DBars() { } -/*! - * \internal - */ -void Q3DBars::render() -{ - d_ptr->m_shared->synchDataToRenderer(); - d_ptr->m_shared->render(); -} - #if defined(Q_OS_ANDROID) /*! * \internal diff --git a/src/datavisualization/engine/q3dbars.h b/src/datavisualization/engine/q3dbars.h index 9a8e97bb..078100a1 100644 --- a/src/datavisualization/engine/q3dbars.h +++ b/src/datavisualization/engine/q3dbars.h @@ -124,7 +124,6 @@ signals: void selectedBarPosChanged(QPoint position); protected: - void render(); #if defined(Q_OS_ANDROID) void mouseDoubleClickEvent(QMouseEvent *event); diff --git a/src/datavisualization/engine/q3dscatter.cpp b/src/datavisualization/engine/q3dscatter.cpp index 715f2b18..0940fc71 100644 --- a/src/datavisualization/engine/q3dscatter.cpp +++ b/src/datavisualization/engine/q3dscatter.cpp @@ -203,6 +203,7 @@ QT_DATAVISUALIZATION_BEGIN_NAMESPACE Q3DScatter::Q3DScatter() : d_ptr(new Q3DScatterPrivate(this, geometry())) { + setVisualController(d_ptr->m_shared); d_ptr->m_shared->initializeOpenGL(); QObject::connect(d_ptr->m_shared, &Scatter3DController::selectedItemIndexChanged, this, &Q3DScatter::selectedItemIndexChanged); @@ -217,15 +218,6 @@ Q3DScatter::~Q3DScatter() { } -/*! - * \internal - */ -void Q3DScatter::render() -{ - d_ptr->m_shared->synchDataToRenderer(); - d_ptr->m_shared->render(); -} - #if defined(Q_OS_ANDROID) /*! * \internal diff --git a/src/datavisualization/engine/q3dscatter.h b/src/datavisualization/engine/q3dscatter.h index 4160b168..8fa3eae4 100644 --- a/src/datavisualization/engine/q3dscatter.h +++ b/src/datavisualization/engine/q3dscatter.h @@ -112,7 +112,6 @@ signals: void selectedItemIndexChanged(int index); protected: - void render(); #if defined(Q_OS_ANDROID) void mouseDoubleClickEvent(QMouseEvent *event); diff --git a/src/datavisualization/engine/q3dscene.cpp b/src/datavisualization/engine/q3dscene.cpp index 53bfe480..abf41b19 100644 --- a/src/datavisualization/engine/q3dscene.cpp +++ b/src/datavisualization/engine/q3dscene.cpp @@ -242,6 +242,23 @@ void Q3DScene::setActiveLight(Q3DLight *light) } /*! + * \property Q3DScene::devicePixelRatio + * + * This property contains the current device pixel ratio that is used when mapping input + * coordinates to pixel coordinates. + */ +qreal Q3DScene::devicePixelRatio() const +{ + return d_ptr->m_devicePixelRatio; +} + +void Q3DScene::setDevicePixelRatio(qreal pixelRatio) +{ + d_ptr->m_devicePixelRatio = pixelRatio; +} + + +/*! * Calculates and sets the light position relative to the currently active camera using the given parameters. * \a relativePosition defines the relative 3D offset to the current camera position. * Optional \a fixedRotation fixes the light rotation around the data visualization area to the given value in degrees. @@ -272,6 +289,7 @@ void Q3DScene::setUnderSideCameraEnabled(bool isEnabled) Q3DScenePrivate::Q3DScenePrivate(Q3DScene *q) : q_ptr(q), + m_devicePixelRatio(1.f), m_camera(), m_light(), m_isUnderSideCameraEnabled(false), @@ -328,6 +346,12 @@ void Q3DScenePrivate::sync(Q3DScenePrivate &other) m_changeTracker.slicingActivatedChanged = false; other.m_changeTracker.slicingActivatedChanged = false; } + + if (m_changeTracker.devicePixelRatioChanged) { + other.q_ptr->setDevicePixelRatio(q_ptr->devicePixelRatio()); + m_changeTracker.devicePixelRatioChanged = false; + other.m_changeTracker.devicePixelRatioChanged = false; + } } QT_DATAVISUALIZATION_END_NAMESPACE diff --git a/src/datavisualization/engine/q3dscene.h b/src/datavisualization/engine/q3dscene.h index 483a24b8..8c4f67f8 100644 --- a/src/datavisualization/engine/q3dscene.h +++ b/src/datavisualization/engine/q3dscene.h @@ -39,6 +39,7 @@ class QT_DATAVISUALIZATION_EXPORT Q3DScene : public QObject Q_PROPERTY(bool slicingActive READ isSlicingActive WRITE setSlicingActive) Q_PROPERTY(Q3DCamera* activeCamera READ activeCamera WRITE setActiveCamera) Q_PROPERTY(Q3DLight* activeLight READ activeLight WRITE setActiveLight) + Q_PROPERTY(qreal devicePixelRatio READ devicePixelRatio WRITE setDevicePixelRatio) public: Q3DScene(QObject *parent = 0); @@ -65,6 +66,9 @@ public: Q3DLight *activeLight() const; void setActiveLight(Q3DLight *light); + qreal devicePixelRatio() const; + void setDevicePixelRatio(qreal pixelRatio); + void setLightPositionRelativeToCamera(const QVector3D &relativePosition, qreal fixedRotation = 0.0, qreal distanceModifier = 0.0); diff --git a/src/datavisualization/engine/q3dscene_p.h b/src/datavisualization/engine/q3dscene_p.h index 63d34e97..20a74467 100644 --- a/src/datavisualization/engine/q3dscene_p.h +++ b/src/datavisualization/engine/q3dscene_p.h @@ -46,6 +46,7 @@ struct Q3DSceneChangeBitField { bool lightChanged : 1; bool underSideCameraEnabledChanged : 1; bool slicingActivatedChanged : 1; + bool devicePixelRatioChanged : 1; Q3DSceneChangeBitField() : viewportChanged(true), @@ -54,7 +55,8 @@ struct Q3DSceneChangeBitField { cameraChanged(true), lightChanged(true), underSideCameraEnabledChanged(true), - slicingActivatedChanged(true) + slicingActivatedChanged(true), + devicePixelRatioChanged(true) { } }; @@ -73,6 +75,7 @@ public: QRect m_viewport; QRect m_primarySubViewport; QRect m_secondarySubViewport; + qreal m_devicePixelRatio; Q3DCamera *m_camera; Q3DLight *m_light; bool m_isUnderSideCameraEnabled; diff --git a/src/datavisualization/engine/q3dsurface.cpp b/src/datavisualization/engine/q3dsurface.cpp index 23a1b14b..e066f717 100644 --- a/src/datavisualization/engine/q3dsurface.cpp +++ b/src/datavisualization/engine/q3dsurface.cpp @@ -203,6 +203,7 @@ QT_DATAVISUALIZATION_BEGIN_NAMESPACE Q3DSurface::Q3DSurface() : d_ptr(new Q3DSurfacePrivate(this, geometry())) { + setVisualController(d_ptr->m_shared); d_ptr->m_shared->initializeOpenGL(); QObject::connect(d_ptr->m_shared, &Abstract3DController::needRender, this, &Q3DWindow::renderLater); @@ -215,15 +216,6 @@ Q3DSurface::~Q3DSurface() { } -/*! - * \internal - */ -void Q3DSurface::render() -{ - d_ptr->m_shared->synchDataToRenderer(); - d_ptr->m_shared->render(); -} - #if defined(Q_OS_ANDROID) /*! * \internal diff --git a/src/datavisualization/engine/q3dsurface.h b/src/datavisualization/engine/q3dsurface.h index 82eee7ae..1622def3 100644 --- a/src/datavisualization/engine/q3dsurface.h +++ b/src/datavisualization/engine/q3dsurface.h @@ -92,7 +92,6 @@ public: QDataVis::LabelTransparency labelTransparency() const; protected: - void render(); #if defined(Q_OS_ANDROID) void mouseDoubleClickEvent(QMouseEvent *event); diff --git a/src/datavisualization/engine/q3dwindow.cpp b/src/datavisualization/engine/q3dwindow.cpp index 34bbdf05..16202179 100644 --- a/src/datavisualization/engine/q3dwindow.cpp +++ b/src/datavisualization/engine/q3dwindow.cpp @@ -18,7 +18,7 @@ #include "q3dwindow.h" #include "q3dwindow_p.h" - +#include "abstract3dcontroller_p.h" #include <QGuiApplication> #include <QOpenGLContext> @@ -93,8 +93,33 @@ Q3DWindow::~Q3DWindow() /*! * \internal */ +void Q3DWindow::setVisualController(Abstract3DController *controller) +{ + d_ptr->m_visualController = controller; +} + +/*! + * \internal + */ +void Q3DWindow::handleDevicePixelRatioChange() +{ + if (QWindow::devicePixelRatio() == d_ptr->m_devicePixelRatio || !d_ptr->m_visualController) + return; + + // Device pixel ratio changed, resize accordingly and inform the scene + d_ptr->m_devicePixelRatio = QWindow::devicePixelRatio(); + d_ptr->m_visualController->updateDevicePixelRatio(d_ptr->m_devicePixelRatio); + +} + +/*! + * \internal + */ void Q3DWindow::render() { + handleDevicePixelRatioChange(); + d_ptr->m_visualController->synchDataToRenderer(); + d_ptr->m_visualController->render(); } /*! @@ -153,7 +178,9 @@ void Q3DWindow::renderNow() Q3DWindowPrivate::Q3DWindowPrivate(Q3DWindow *q) : q_ptr(q), m_updatePending(false), - m_context(new QOpenGLContext(q)) + m_context(new QOpenGLContext(q)), + m_visualController(0), + m_devicePixelRatio(1.f) { } diff --git a/src/datavisualization/engine/q3dwindow.h b/src/datavisualization/engine/q3dwindow.h index c46e293a..1848ff29 100644 --- a/src/datavisualization/engine/q3dwindow.h +++ b/src/datavisualization/engine/q3dwindow.h @@ -23,12 +23,14 @@ #include <QWindow> #include <QOpenGLFunctions> +#include <QScreen> class QPainter; QT_DATAVISUALIZATION_BEGIN_NAMESPACE class Q3DWindowPrivate; +class Abstract3DController; class QT_DATAVISUALIZATION_EXPORT Q3DWindow : public QWindow, protected QOpenGLFunctions { @@ -47,6 +49,8 @@ protected: bool event(QEvent *event); void exposeEvent(QExposeEvent *event); + void setVisualController(Abstract3DController *controller); + void handleDevicePixelRatioChange(); private: QScopedPointer<Q3DWindowPrivate> d_ptr; diff --git a/src/datavisualization/engine/q3dwindow_p.h b/src/datavisualization/engine/q3dwindow_p.h index b5ec9e6f..6bef7e10 100644 --- a/src/datavisualization/engine/q3dwindow_p.h +++ b/src/datavisualization/engine/q3dwindow_p.h @@ -37,6 +37,7 @@ class QOpenGLPaintDevice; QT_DATAVISUALIZATION_BEGIN_NAMESPACE class Q3DWindow; +class Abstract3DController; class Q3DWindowPrivate { @@ -48,8 +49,9 @@ public: Q3DWindow *q_ptr; bool m_updatePending; - QOpenGLContext *m_context; + Abstract3DController *m_visualController; + qreal m_devicePixelRatio; }; QT_DATAVISUALIZATION_END_NAMESPACE |