From 824cf363f6ab999d2fc38ebdab1f7faae5559ad0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Wed, 14 May 2014 11:19:28 +0300 Subject: Added option to use orthographic projection Task-number: QTRD-3078 Change-Id: I07ebc2b7edd542cd28e405dfc80282f18b7a7314 Reviewed-by: Mika Salmela Reviewed-by: Miikka Heikkinen --- ...tdatavisualization-qml-abstractdeclarative.qdoc | 16 +++++++++--- .../engine/abstract3dcontroller.cpp | 30 ++++++++++++++++++++++ .../engine/abstract3dcontroller_p.h | 10 +++++++- .../engine/abstract3drenderer.cpp | 3 ++- .../engine/abstract3drenderer_p.h | 2 ++ src/datavisualization/engine/bars3drenderer.cpp | 21 ++++++++++++--- src/datavisualization/engine/qabstract3dgraph.cpp | 24 +++++++++++++++-- src/datavisualization/engine/qabstract3dgraph.h | 5 ++++ src/datavisualization/engine/scatter3drenderer.cpp | 9 ++++++- src/datavisualization/engine/selectionpointer.cpp | 15 +++++++---- src/datavisualization/engine/selectionpointer_p.h | 2 +- src/datavisualization/engine/surface3drenderer.cpp | 14 +++++++--- 12 files changed, 130 insertions(+), 21 deletions(-) (limited to 'src/datavisualization') diff --git a/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc b/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc index 32210b98..62e4034f 100644 --- a/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc +++ b/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc @@ -57,7 +57,7 @@ /*! \qmlproperty AbstractInputHandler3D AbstractGraph3D::inputHandler - Input handler. You can disable default input handlers by setting this property to \c null. + Input handler. You can disable default input handlers by setting this property to \c {null}. */ /*! @@ -119,7 +119,7 @@ When renderingMode is \c RenderDirectToBackground or \c RenderDirectToBackground_NoClear, this property value is read-only and returns the number of samples specified by the window surface format. - Defaults to 4. + Defaults to \c{4}. \sa renderingMode */ @@ -128,8 +128,8 @@ * \qmlproperty bool AbstractGraph3D::measureFps * \since QtDataVisualization 1.1 * - * If \c true, the rendering is done continuously instead of on demand, and currentFps property - * is updated. Defaults to false. + * If \c {true}, the rendering is done continuously instead of on demand, and currentFps property + * is updated. Defaults to \c{false}. * * \sa currentFps */ @@ -241,3 +241,11 @@ * * \since Qt Data Visualization 1.1 */ + +/*! + * \qmlproperty bool QAbstract3DGraph::orthoProjection + * \since Qt Data Visualization 1.1 + * + * If \c {true}, orthographic projection will be used for displaying the graph. Defaults to \c{false}. + * \note Shadows will be disabled when set to \c{true}. + */ diff --git a/src/datavisualization/engine/abstract3dcontroller.cpp b/src/datavisualization/engine/abstract3dcontroller.cpp index 7c30f1c0..6b6f154d 100644 --- a/src/datavisualization/engine/abstract3dcontroller.cpp +++ b/src/datavisualization/engine/abstract3dcontroller.cpp @@ -43,6 +43,7 @@ Abstract3DController::Abstract3DController(QRect initialViewport, Q3DScene *scen m_themeManager(new ThemeManager(this)), m_selectionMode(QAbstract3DGraph::SelectionItem), m_shadowQuality(QAbstract3DGraph::ShadowQualityMedium), + m_useOrthoProjection(false), m_scene(scene), m_activeInputHandler(0), m_axisX(0), @@ -189,6 +190,11 @@ void Abstract3DController::synchDataToRenderer() m_changeTracker.selectionModeChanged = false; } + if (m_changeTracker.projectionChanged) { + m_renderer->m_useOrthoProjection = m_useOrthoProjection; + m_changeTracker.projectionChanged = false; + } + if (m_changeTracker.axisXFormatterChanged) { m_changeTracker.axisXFormatterChanged = false; if (m_axisX->type() & QAbstract3DAxis::AxisTypeValue) { @@ -794,6 +800,12 @@ QAbstract3DGraph::SelectionFlags Abstract3DController::selectionMode() const } void Abstract3DController::setShadowQuality(QAbstract3DGraph::ShadowQuality quality) +{ + if (!m_useOrthoProjection) + doSetShadowQuality(quality); +} + +void Abstract3DController::doSetShadowQuality(QAbstract3DGraph::ShadowQuality quality) { if (quality != m_shadowQuality) { m_shadowQuality = quality; @@ -1313,4 +1325,22 @@ QCustom3DItem *Abstract3DController::selectedCustomItem() const return item; } +void Abstract3DController::setOrthoProjection(bool enable) +{ + if (enable != m_useOrthoProjection) { + m_useOrthoProjection = enable; + m_changeTracker.projectionChanged = true; + emit orthoProjectionChanged(m_useOrthoProjection); + // If changed to ortho, disable shadows + if (m_useOrthoProjection) + doSetShadowQuality(QAbstract3DGraph::ShadowQualityNone); + emitNeedRender(); + } +} + +bool Abstract3DController::isOrthoProjection() const +{ + return m_useOrthoProjection; +} + QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/engine/abstract3dcontroller_p.h b/src/datavisualization/engine/abstract3dcontroller_p.h index 62b647a6..41c75d8e 100644 --- a/src/datavisualization/engine/abstract3dcontroller_p.h +++ b/src/datavisualization/engine/abstract3dcontroller_p.h @@ -82,6 +82,7 @@ struct Abstract3DChangeBitField { bool axisXFormatterChanged : 1; bool axisYFormatterChanged : 1; bool axisZFormatterChanged : 1; + bool projectionChanged : 1; Abstract3DChangeBitField() : zoomLevelChanged(true), @@ -115,7 +116,8 @@ struct Abstract3DChangeBitField { axisZReversedChanged(true), axisXFormatterChanged(true), axisYFormatterChanged(true), - axisZFormatterChanged(true) + axisZFormatterChanged(true), + projectionChanged(true) { } }; @@ -148,6 +150,7 @@ private: ThemeManager *m_themeManager; QAbstract3DGraph::SelectionFlags m_selectionMode; QAbstract3DGraph::ShadowQuality m_shadowQuality; + bool m_useOrthoProjection; protected: Q3DScene *m_scene; @@ -223,6 +226,7 @@ public: virtual QAbstract3DGraph::SelectionFlags selectionMode() const; virtual void setShadowQuality(QAbstract3DGraph::ShadowQuality quality); + virtual void doSetShadowQuality(QAbstract3DGraph::ShadowQuality quality); virtual QAbstract3DGraph::ShadowQuality shadowQuality() const; virtual bool shadowsSupported() const; @@ -246,6 +250,9 @@ public: int selectedCustomItemIndex() const; QCustom3DItem *selectedCustomItem() const; + void setOrthoProjection(bool enable); + bool isOrthoProjection() const; + void emitNeedRender(); virtual void clearSelection() = 0; @@ -315,6 +322,7 @@ signals: void elementSelected(QAbstract3DGraph::ElementType type); void measureFpsChanged(bool enabled); void currentFpsChanged(qreal fps); + void orthoProjectionChanged(bool enabled); protected: virtual QAbstract3DAxis *createDefaultAxis(QAbstract3DAxis::AxisOrientation orientation); diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp index 6fde5f20..bcf03ed7 100644 --- a/src/datavisualization/engine/abstract3drenderer.cpp +++ b/src/datavisualization/engine/abstract3drenderer.cpp @@ -51,7 +51,8 @@ Abstract3DRenderer::Abstract3DRenderer(Abstract3DController *controller) m_clickedType(QAbstract3DGraph::ElementNone), m_selectionLabelItem(0), m_visibleSeriesCount(0), - m_customItemShader(0) + m_customItemShader(0), + m_useOrthoProjection(false) { QObject::connect(m_drawer, &Drawer::drawerChanged, this, &Abstract3DRenderer::updateTextures); diff --git a/src/datavisualization/engine/abstract3drenderer_p.h b/src/datavisualization/engine/abstract3drenderer_p.h index 58173a61..5063f506 100644 --- a/src/datavisualization/engine/abstract3drenderer_p.h +++ b/src/datavisualization/engine/abstract3drenderer_p.h @@ -189,6 +189,8 @@ protected: ShaderHelper *m_customItemShader; + bool m_useOrthoProjection; + private: friend class Abstract3DController; }; diff --git a/src/datavisualization/engine/bars3drenderer.cpp b/src/datavisualization/engine/bars3drenderer.cpp index 661c3f3e..459f8c25 100644 --- a/src/datavisualization/engine/bars3drenderer.cpp +++ b/src/datavisualization/engine/bars3drenderer.cpp @@ -445,8 +445,16 @@ void Bars3DRenderer::drawSlicedScene() // Set up projection matrix QMatrix4x4 projectionMatrix; - projectionMatrix.perspective(35.0f, (GLfloat)m_secondarySubViewport.width() - / (GLfloat)m_secondarySubViewport.height(), 0.1f, 100.0f); + GLfloat viewPortRatio = (GLfloat)m_primarySubViewport.width() + / (GLfloat)m_primarySubViewport.height(); + if (m_useOrthoProjection) { + GLfloat orthoRatio = 2.0f / m_autoScaleAdjustment; + projectionMatrix.ortho(-viewPortRatio * orthoRatio, viewPortRatio * orthoRatio, + -orthoRatio, orthoRatio, + 0.0f, 100.0f); + } else { + projectionMatrix.perspective(35.0f, viewPortRatio, 0.1f, 100.0f); + } // Set view matrix QMatrix4x4 viewMatrix; @@ -923,7 +931,14 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) QMatrix4x4 projectionMatrix; GLfloat viewPortRatio = (GLfloat)m_primarySubViewport.width() / (GLfloat)m_primarySubViewport.height(); - projectionMatrix.perspective(45.0f, viewPortRatio, 0.1f, 100.0f); + if (m_useOrthoProjection) { + GLfloat orthoRatio = 2.0f; + projectionMatrix.ortho(-viewPortRatio * orthoRatio, viewPortRatio * orthoRatio, + -orthoRatio, orthoRatio, + 0.0f, 100.0f); + } else { + projectionMatrix.perspective(45.0f, viewPortRatio, 0.1f, 100.0f); + } // Get the view matrix QMatrix4x4 viewMatrix = activeCamera->d_ptr->viewMatrix(); diff --git a/src/datavisualization/engine/qabstract3dgraph.cpp b/src/datavisualization/engine/qabstract3dgraph.cpp index 48d8494e..b3a788cb 100644 --- a/src/datavisualization/engine/qabstract3dgraph.cpp +++ b/src/datavisualization/engine/qabstract3dgraph.cpp @@ -512,8 +512,8 @@ QImage QAbstract3DGraph::renderToImage(int msaaSamples, const QSize &imageSize) * \property QAbstract3DGraph::measureFps * \since Qt Data Visualization 1.1 * - * If \c true, the rendering is done continuously instead of on demand, and currentFps property - * is updated. Defaults to false. + * If \c {true}, the rendering is done continuously instead of on demand, and currentFps property + * is updated. Defaults to \c{false}. * * \sa currentFps */ @@ -541,6 +541,23 @@ qreal QAbstract3DGraph::currentFps() const return d_ptr->m_visualController->currentFps(); } +/*! + * \property QAbstract3DGraph::orthoProjection + * \since Qt Data Visualization 1.1 + * + * If \c {true}, orthographic projection will be used for displaying the graph. Defaults to \c{false}. + * \note Shadows will be disabled when set to \c{true}. + */ +void QAbstract3DGraph::setOrthoProjection(bool enable) +{ + d_ptr->m_visualController->setOrthoProjection(enable); +} + +bool QAbstract3DGraph::isOrthoProjection() const +{ + return d_ptr->m_visualController->isOrthoProjection(); +} + /*! * \internal */ @@ -683,6 +700,9 @@ void QAbstract3DGraphPrivate::setVisualController(Abstract3DController *controll &QAbstract3DGraph::measureFpsChanged); QObject::connect(m_visualController, &Abstract3DController::currentFpsChanged, q_ptr, &QAbstract3DGraph::currentFpsChanged); + + QObject::connect(m_visualController, &Abstract3DController::orthoProjectionChanged, q_ptr, + &QAbstract3DGraph::orthoProjectionChanged); } void QAbstract3DGraphPrivate::handleDevicePixelRatioChange() diff --git a/src/datavisualization/engine/qabstract3dgraph.h b/src/datavisualization/engine/qabstract3dgraph.h index aeccf667..bfc03cc1 100644 --- a/src/datavisualization/engine/qabstract3dgraph.h +++ b/src/datavisualization/engine/qabstract3dgraph.h @@ -44,6 +44,7 @@ class QT_DATAVISUALIZATION_EXPORT QAbstract3DGraph : public QWindow, protected Q Q_PROPERTY(Q3DScene* scene READ scene) Q_PROPERTY(bool measureFps READ measureFps WRITE setMeasureFps NOTIFY measureFpsChanged) Q_PROPERTY(qreal currentFps READ currentFps NOTIFY currentFpsChanged) + Q_PROPERTY(bool orthoProjection READ isOrthoProjection WRITE setOrthoProjection NOTIFY orthoProjectionChanged) protected: explicit QAbstract3DGraph(QAbstract3DGraphPrivate *d, const QSurfaceFormat *format, @@ -126,6 +127,9 @@ public: bool measureFps() const; qreal currentFps() const; + void setOrthoProjection(bool enable); + bool isOrthoProjection() const; + protected: bool event(QEvent *event); void resizeEvent(QResizeEvent *event); @@ -146,6 +150,7 @@ signals: void elementSelected(QAbstract3DGraph::ElementType type); void measureFpsChanged(bool enabled); void currentFpsChanged(qreal fps); + void orthoProjectionChanged(bool enabled); private: Q_DISABLE_COPY(QAbstract3DGraph) diff --git a/src/datavisualization/engine/scatter3drenderer.cpp b/src/datavisualization/engine/scatter3drenderer.cpp index b71cd22b..70fb7ed2 100644 --- a/src/datavisualization/engine/scatter3drenderer.cpp +++ b/src/datavisualization/engine/scatter3drenderer.cpp @@ -329,7 +329,14 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) QMatrix4x4 projectionMatrix; GLfloat viewPortRatio = (GLfloat)m_primarySubViewport.width() / (GLfloat)m_primarySubViewport.height(); - projectionMatrix.perspective(45.0f, viewPortRatio, 0.1f, 100.0f); + if (m_useOrthoProjection) { + GLfloat orthoRatio = 2.0f; + projectionMatrix.ortho(-viewPortRatio * orthoRatio, viewPortRatio * orthoRatio, + -orthoRatio, orthoRatio, + 0.0f, 100.0f); + } else { + projectionMatrix.perspective(45.0f, viewPortRatio, 0.1f, 100.0f); + } // Calculate view matrix QMatrix4x4 viewMatrix = activeCamera->d_ptr->viewMatrix(); diff --git a/src/datavisualization/engine/selectionpointer.cpp b/src/datavisualization/engine/selectionpointer.cpp index e3708095..646212f0 100644 --- a/src/datavisualization/engine/selectionpointer.cpp +++ b/src/datavisualization/engine/selectionpointer.cpp @@ -74,7 +74,7 @@ void SelectionPointer::updateScene(Q3DScene *scene) m_cachedScene = scene; } -void SelectionPointer::render(GLuint defaultFboHandle) +void SelectionPointer::render(GLuint defaultFboHandle, bool useOrtho) { Q_UNUSED(defaultFboHandle) @@ -89,17 +89,22 @@ void SelectionPointer::render(GLuint defaultFboHandle) // Get view matrix QMatrix4x4 viewMatrix; QMatrix4x4 projectionMatrix; + GLfloat viewPortRatio = (GLfloat)m_mainViewPort.width() / (GLfloat)m_mainViewPort.height(); if (m_cachedIsSlicingActivated) { - GLfloat aspect = (GLfloat)m_mainViewPort.width() / (GLfloat)m_mainViewPort.height(); GLfloat sliceUnitsScaled = sliceUnits / m_autoScaleAdjustment; viewMatrix.lookAt(QVector3D(0.0f, 0.0f, 1.0f), zeroVector, upVector); - projectionMatrix.ortho(-sliceUnitsScaled * aspect, sliceUnitsScaled * aspect, + projectionMatrix.ortho(-sliceUnitsScaled * viewPortRatio, sliceUnitsScaled * viewPortRatio, -sliceUnitsScaled, sliceUnitsScaled, -1.0f, 4.0f); + } else if (useOrtho) { + viewMatrix = camera->d_ptr->viewMatrix(); + GLfloat orthoRatio = 2.0f; + projectionMatrix.ortho(-viewPortRatio * orthoRatio, viewPortRatio * orthoRatio, + -orthoRatio, orthoRatio, + 0.0f, 100.0f); } else { viewMatrix = camera->d_ptr->viewMatrix(); - projectionMatrix.perspective(45.0f, (GLfloat)m_mainViewPort.width() - / (GLfloat)m_mainViewPort.height(), 0.1f, 100.0f); + projectionMatrix.perspective(45.0f, viewPortRatio, 0.1f, 100.0f); } // Calculate scale factor to get uniform font size diff --git a/src/datavisualization/engine/selectionpointer_p.h b/src/datavisualization/engine/selectionpointer_p.h index 7c6762be..03e09cca 100644 --- a/src/datavisualization/engine/selectionpointer_p.h +++ b/src/datavisualization/engine/selectionpointer_p.h @@ -49,7 +49,7 @@ public: explicit SelectionPointer(Drawer *drawer); ~SelectionPointer(); - void render(GLuint defaultFboHandle = 0); + void render(GLuint defaultFboHandle = 0, bool useOrtho = false); void setPosition(const QVector3D &position); void setLabel(const QString &label); void setPointerObject(ObjectHelper *object); diff --git a/src/datavisualization/engine/surface3drenderer.cpp b/src/datavisualization/engine/surface3drenderer.cpp index a75cf699..30ffc381 100644 --- a/src/datavisualization/engine/surface3drenderer.cpp +++ b/src/datavisualization/engine/surface3drenderer.cpp @@ -733,7 +733,7 @@ void Surface3DRenderer::render(GLuint defaultFboHandle) cache->sliceSelectionPointer()->render(defaultFboHandle); } if (cache->mainPointerActive() && cache->renderable()) - cache->mainSelectionPointer()->render(defaultFboHandle); + cache->mainSelectionPointer()->render(defaultFboHandle, m_useOrthoProjection); } } } @@ -1040,8 +1040,16 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) // Set up projection matrix QMatrix4x4 projectionMatrix; - projectionMatrix.perspective(45.0f, (GLfloat)m_primarySubViewport.width() - / (GLfloat)m_primarySubViewport.height(), 0.1f, 100.0f); + GLfloat viewPortRatio = (GLfloat)m_primarySubViewport.width() + / (GLfloat)m_primarySubViewport.height(); + if (m_useOrthoProjection) { + GLfloat orthoRatio = 2.0f; + projectionMatrix.ortho(-viewPortRatio * orthoRatio, viewPortRatio * orthoRatio, + -orthoRatio, orthoRatio, + 0.0f, 100.0f); + } else { + projectionMatrix.perspective(45.0f, viewPortRatio, 0.1f, 100.0f); + } const Q3DCamera *activeCamera = m_cachedScene->activeCamera(); -- cgit v1.2.3