From 7b621b89e40b9006bc8ffbb8595bba336fb60d42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kera=CC=88nen=20Pasi?= Date: Fri, 29 Nov 2013 16:25:19 +0200 Subject: Fixes retina issues with C++ widget graphs. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task-id: QTRD-2660 Change-Id: Icd36c082f45077a1ebb3372838f43a50fd277076 Reviewed-by: Tomi Korpipää Reviewed-by: Miikka Heikkinen --- .../engine/abstract3dcontroller.cpp | 68 +++++++++------------- .../engine/abstract3dcontroller_p.h | 9 +-- .../engine/abstract3drenderer.cpp | 11 ++-- src/datavisualization/engine/bars3drenderer.cpp | 18 +++--- src/datavisualization/engine/bars3drenderer_p.h | 2 - src/datavisualization/engine/q3dwindow.cpp | 4 +- src/datavisualization/engine/scatter3drenderer.cpp | 12 ++-- src/datavisualization/engine/scatter3drenderer_p.h | 2 - src/datavisualization/engine/surface3drenderer.cpp | 13 ++++- 9 files changed, 67 insertions(+), 72 deletions(-) diff --git a/src/datavisualization/engine/abstract3dcontroller.cpp b/src/datavisualization/engine/abstract3dcontroller.cpp index 7820cb31..7165ca58 100644 --- a/src/datavisualization/engine/abstract3dcontroller.cpp +++ b/src/datavisualization/engine/abstract3dcontroller.cpp @@ -69,6 +69,8 @@ Abstract3DController::Abstract3DController(QRect boundRect, QObject *parent) : &Abstract3DController::handleInputPositionChanged); connect(m_scene, &Q3DScene::needRender, this, &Abstract3DController::emitNeedRender); + connect(m_scene, &Q3DScene::devicePixelRatioChanged, this, + &Abstract3DController::handlePixelRatioChanged); } Abstract3DController::~Abstract3DController() @@ -401,27 +403,22 @@ void Abstract3DController::wheelEvent(QWheelEvent *event) void Abstract3DController::setSize(const int width, const int height) { - m_boundingRect.setWidth(width); - m_boundingRect.setHeight(height); + float devicePixelRatio = m_scene->devicePixelRatio(); m_scene->setViewportSize(width, height); + m_boundingRect.setWidth(width * devicePixelRatio); + m_boundingRect.setHeight(height * devicePixelRatio); m_changeTracker.boundingRectChanged = true; emitNeedRender(); } -const QSize Abstract3DController::size() -{ - return m_boundingRect.size(); -} - -const QRect Abstract3DController::boundingRect() -{ - return m_boundingRect; -} - void Abstract3DController::setBoundingRect(const QRect boundingRect) { - m_boundingRect = boundingRect; + float devicePixelRatio = m_scene->devicePixelRatio(); + m_boundingRect = QRect(boundingRect.x() * devicePixelRatio, + boundingRect.y() * devicePixelRatio, + boundingRect.width() * devicePixelRatio, + boundingRect.height() * devicePixelRatio); m_scene->setViewport(boundingRect); m_changeTracker.boundingRectChanged = true; @@ -430,58 +427,46 @@ void Abstract3DController::setBoundingRect(const QRect boundingRect) void Abstract3DController::setWidth(const int width) { - m_boundingRect.setWidth(width); + m_boundingRect.setWidth(width * m_scene->devicePixelRatio()); m_scene->setViewportSize(width, m_scene->viewport().height()); m_changeTracker.sizeChanged = true; emitNeedRender(); } -int Abstract3DController::width() -{ - return m_boundingRect.width(); -} - void Abstract3DController::setHeight(const int height) { - m_boundingRect.setHeight(height); + m_boundingRect.setHeight(height * m_scene->devicePixelRatio()); m_scene->setViewportSize(m_scene->viewport().width(), height); m_changeTracker.sizeChanged = true; emitNeedRender(); } -int Abstract3DController::height() -{ - return m_boundingRect.height(); -} - void Abstract3DController::setX(const int x) { - m_boundingRect.setX(x); + m_boundingRect.setX(x * m_scene->devicePixelRatio()); + m_scene->setViewport( QRect(x, + m_scene->viewport().y(), + m_scene->viewport().width(), + m_scene->viewport().height())); m_changeTracker.positionChanged = true; emitNeedRender(); } -int Abstract3DController::x() -{ - return m_boundingRect.x(); -} - void Abstract3DController::setY(const int y) { - m_boundingRect.setY(y); + m_boundingRect.setY(y * m_scene->devicePixelRatio()); + m_scene->setViewport( QRect(m_scene->viewport().x(), + y, + m_scene->viewport().width(), + m_scene->viewport().height())); m_changeTracker.positionChanged = true; emitNeedRender(); } -int Abstract3DController::y() -{ - return m_boundingRect.y(); -} - QRect Abstract3DController::primarySubViewport() const { return m_scene->primarySubViewport(); @@ -502,9 +487,14 @@ void Abstract3DController::setSecondarySubViewport(const QRect &secondarySubView m_scene->setSecondarySubViewport(secondarySubViewport); } -void Abstract3DController::updateDevicePixelRatio(float ratio) +void Abstract3DController::handlePixelRatioChanged(float ratio) { - m_scene->setDevicePixelRatio(ratio); + m_boundingRect.setX(ratio * m_scene->viewport().x()); + m_boundingRect.setY(ratio * m_scene->viewport().y()); + m_boundingRect.setWidth(ratio * m_scene->viewport().width()); + m_boundingRect.setHeight(ratio * m_scene->viewport().height()); + m_changeTracker.boundingRectChanged = true; + emitNeedRender(); } void Abstract3DController::setAxisX(Q3DAbstractAxis *axis) diff --git a/src/datavisualization/engine/abstract3dcontroller_p.h b/src/datavisualization/engine/abstract3dcontroller_p.h index 850bd3e5..e1f69053 100644 --- a/src/datavisualization/engine/abstract3dcontroller_p.h +++ b/src/datavisualization/engine/abstract3dcontroller_p.h @@ -203,17 +203,11 @@ public: // Size virtual void setSize(const int width, const int height); - virtual const QSize size(); - virtual const QRect boundingRect(); virtual void setBoundingRect(const QRect boundingRect); virtual void setWidth(const int width); - virtual int width(); virtual void setHeight(const int height); - virtual int height(); virtual void setX(const int x); - virtual int x(); virtual void setY(const int y); - virtual int y(); virtual QRect primarySubViewport() const; virtual void setPrimarySubViewport(const QRect &primarySubViewport); @@ -236,8 +230,6 @@ public: virtual void setActiveInputHandler(QAbstract3DInputHandler *inputHandler); virtual QAbstract3DInputHandler *activeInputHandler(); - virtual void updateDevicePixelRatio(float ratio); - virtual int zoomLevel(); virtual void setZoomLevel(int zoomLevel); @@ -305,6 +297,7 @@ public slots: void handleInputStateChanged(QDataVis::InputState state); void handleInputPositionChanged(const QPoint &position); void handleSeriesVisibilityChanged(bool visible); + void handlePixelRatioChanged(float ratio); // Renderer callback handlers void handleRequestShadowQuality(QDataVis::ShadowQuality quality); diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp index 06f13b5d..bafe6727 100644 --- a/src/datavisualization/engine/abstract3drenderer.cpp +++ b/src/datavisualization/engine/abstract3drenderer.cpp @@ -179,18 +179,21 @@ void Abstract3DRenderer::updateTheme(Q3DTheme *theme) void Abstract3DRenderer::updateScene(Q3DScene *scene) { - updateInputPosition(scene->selectionQueryPosition()); + float devicePixelRatio = scene->devicePixelRatio(); + QPoint logicalPixelPosition = scene->selectionQueryPosition(); + updateInputPosition(QPoint(logicalPixelPosition.x() * devicePixelRatio, + logicalPixelPosition.y() * devicePixelRatio)); - if (Q3DScene::invalidSelectionPoint() == scene->selectionQueryPosition()) { + if (Q3DScene::invalidSelectionPoint() == logicalPixelPosition) { updateSelectionState(SelectNone); } else { // Selections are one-shot, reset selection active to false before processing scene->setSelectionQueryPosition(Q3DScene::invalidSelectionPoint()); if (scene->isSlicingActive()) { - if (scene->isPointInPrimarySubView(m_inputPosition)) + if (scene->isPointInPrimarySubView(logicalPixelPosition)) updateSelectionState(SelectOnOverview); - else if (scene->isPointInSecondarySubView(m_inputPosition)) + else if (scene->isPointInSecondarySubView(logicalPixelPosition)) updateSelectionState(SelectOnSlice); else updateSelectionState(SelectNone); diff --git a/src/datavisualization/engine/bars3drenderer.cpp b/src/datavisualization/engine/bars3drenderer.cpp index e665eca1..c3e8bf79 100644 --- a/src/datavisualization/engine/bars3drenderer.cpp +++ b/src/datavisualization/engine/bars3drenderer.cpp @@ -254,8 +254,17 @@ void Bars3DRenderer::updateData() void Bars3DRenderer::updateScene(Q3DScene *scene) { // TODO: Move these to more suitable place e.g. controller should be controlling the viewports. - scene->setSecondarySubViewport(m_sliceViewPort); - scene->setPrimarySubViewport(m_mainViewPort); + float devicePixelRatio = scene->devicePixelRatio(); + QRect logicalPrimarySubViewport = QRect(m_mainViewPort.x() / devicePixelRatio, + m_mainViewPort.y() / devicePixelRatio, + m_mainViewPort.width() / devicePixelRatio, + m_mainViewPort.height() / devicePixelRatio); + QRect logicalSecondarySubViewport = QRect(m_sliceViewPort.x() / devicePixelRatio, + m_sliceViewPort.y() / devicePixelRatio, + m_sliceViewPort.width() / devicePixelRatio, + m_sliceViewPort.height() / devicePixelRatio); + scene->setPrimarySubViewport(logicalPrimarySubViewport); + scene->setSecondarySubViewport(logicalSecondarySubViewport); // TODO: See QTRD-2374 if (m_hasNegativeValues) @@ -2084,11 +2093,6 @@ void Bars3DRenderer::setViewPorts() } } -QRect Bars3DRenderer::mainViewPort() -{ - return m_mainViewPort; -} - void Bars3DRenderer::initShaders(const QString &vertexShader, const QString &fragmentShader) { if (m_barShader) diff --git a/src/datavisualization/engine/bars3drenderer_p.h b/src/datavisualization/engine/bars3drenderer_p.h index 47c77537..0707dd6f 100644 --- a/src/datavisualization/engine/bars3drenderer_p.h +++ b/src/datavisualization/engine/bars3drenderer_p.h @@ -117,8 +117,6 @@ public: void updateScene(Q3DScene *scene); void render(GLuint defaultFboHandle = 0); - QRect mainViewPort(); - protected: virtual void initializeOpenGL(); diff --git a/src/datavisualization/engine/q3dwindow.cpp b/src/datavisualization/engine/q3dwindow.cpp index 61902323..accac95e 100644 --- a/src/datavisualization/engine/q3dwindow.cpp +++ b/src/datavisualization/engine/q3dwindow.cpp @@ -106,9 +106,8 @@ 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); + d_ptr->m_visualController->scene()->setDevicePixelRatio(d_ptr->m_devicePixelRatio); } /*! @@ -167,6 +166,7 @@ void Q3DWindow::render() d_ptr->m_visualController->render(); } + /*! * \internal */ diff --git a/src/datavisualization/engine/scatter3drenderer.cpp b/src/datavisualization/engine/scatter3drenderer.cpp index 627fc88a..74e589fd 100644 --- a/src/datavisualization/engine/scatter3drenderer.cpp +++ b/src/datavisualization/engine/scatter3drenderer.cpp @@ -187,7 +187,12 @@ void Scatter3DRenderer::updateData() void Scatter3DRenderer::updateScene(Q3DScene *scene) { // TODO: Move these to more suitable place e.g. controller should be controlling the viewports. - scene->setPrimarySubViewport(m_mainViewPort); + float devicePixelRatio = scene->devicePixelRatio(); + QRect logicalPrimarySubViewport = QRect(m_mainViewPort.x() / devicePixelRatio, + m_mainViewPort.y() / devicePixelRatio, + m_mainViewPort.width() / devicePixelRatio, + m_mainViewPort.height() / devicePixelRatio); + scene->setPrimarySubViewport(logicalPrimarySubViewport); // TODO: See QTRD-2374 scene->activeCamera()->setMinYRotation(-90.0f); @@ -1590,11 +1595,6 @@ void Scatter3DRenderer::calculateSceneScalingFactors() (m_axisCacheZ.max() + m_axisCacheZ.min()) / 2.0f); } -QRect Scatter3DRenderer::mainViewPort() -{ - return m_mainViewPort; -} - void Scatter3DRenderer::initShaders(const QString &vertexShader, const QString &fragmentShader) { if (m_dotShader) diff --git a/src/datavisualization/engine/scatter3drenderer_p.h b/src/datavisualization/engine/scatter3drenderer_p.h index 104737eb..0eb84c84 100644 --- a/src/datavisualization/engine/scatter3drenderer_p.h +++ b/src/datavisualization/engine/scatter3drenderer_p.h @@ -100,8 +100,6 @@ public: void render(GLuint defaultFboHandle); - QRect mainViewPort(); - protected: virtual void initializeOpenGL(); diff --git a/src/datavisualization/engine/surface3drenderer.cpp b/src/datavisualization/engine/surface3drenderer.cpp index b0df81d1..46857130 100644 --- a/src/datavisualization/engine/surface3drenderer.cpp +++ b/src/datavisualization/engine/surface3drenderer.cpp @@ -456,8 +456,17 @@ QRect Surface3DRenderer::calculateSampleRect(const QSurfaceDataArray &array) void Surface3DRenderer::updateScene(Q3DScene *scene) { // TODO: Move these to more suitable place e.g. controller should be controlling the viewports. - scene->setSecondarySubViewport(m_sliceViewPort); - scene->setPrimarySubViewport(m_mainViewPort); + float devicePixelRatio = scene->devicePixelRatio(); + QRect logicalPrimarySubViewport = QRect(m_mainViewPort.x() / devicePixelRatio, + m_mainViewPort.y() / devicePixelRatio, + m_mainViewPort.width() / devicePixelRatio, + m_mainViewPort.height() / devicePixelRatio); + QRect logicalSecondarySubViewport = QRect(m_sliceViewPort.x() / devicePixelRatio, + m_sliceViewPort.y() / devicePixelRatio, + m_sliceViewPort.width() / devicePixelRatio, + m_sliceViewPort.height() / devicePixelRatio); + scene->setPrimarySubViewport(logicalPrimarySubViewport); + scene->setSecondarySubViewport(logicalSecondarySubViewport); // Set initial camera position // X must be 0 for rotation to work - we can use "setCameraRotation" for setting it later -- cgit v1.2.3