From ba812351a1577163a1c9794b667f2b4e3acb9373 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Wed, 12 Mar 2014 09:25:51 +0200 Subject: Introduce value axis formatter MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently only used for label formatting. Also some other preparatory changes for logaxis. Task-number: QTRD-2787 Note: Not to be merged until 1.0 is released Change-Id: I2d7ab70b9c51677d0edd5b0226fb779c9e346286 Reviewed-by: Tomi Korpipää --- src/datavisualization/engine/abstract3drenderer.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'src/datavisualization/engine/abstract3drenderer.cpp') diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp index 3122cf76..48453a82 100644 --- a/src/datavisualization/engine/abstract3drenderer.cpp +++ b/src/datavisualization/engine/abstract3drenderer.cpp @@ -26,6 +26,7 @@ #include "qabstract3dseries_p.h" #include "q3dtheme_p.h" #include "objecthelper_p.h" +#include "qvalue3daxisformatter_p.h" QT_BEGIN_NAMESPACE_DATAVISUALIZATION @@ -332,6 +333,18 @@ void Abstract3DRenderer::updateAxisLabelFormat(QAbstract3DAxis::AxisOrientation axisCacheForOrientation(orientation).setLabelFormat(format); } +void Abstract3DRenderer::updateAxisFormatter(QAbstract3DAxis::AxisOrientation orientation, + QValue3DAxisFormatter *formatter) +{ + AxisRenderCache &cache = axisCacheForOrientation(orientation); + if (cache.ctrlFormatter() != formatter) { + delete cache.formatter(); + cache.setFormatter(formatter->createNewInstance()); + cache.setCtrlFormatter(formatter); + } + formatter->populateCopy(*(cache.formatter())); +} + void Abstract3DRenderer::fixMeshFileName(QString &fileName, QAbstract3DSeries::Mesh mesh) { // Default implementation does nothing. -- cgit v1.2.3 From 724bcb35136ed1af699fe8631b9297deb07571ad Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Tue, 18 Mar 2014 15:33:00 +0200 Subject: Actually use axis formatter in renderer. Task-number: QTRD-2787 Change-Id: I0ced8e506928df5fba2e8df94258b53457f4412e Reviewed-by: Mika Salmela --- .../engine/abstract3drenderer.cpp | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) (limited to 'src/datavisualization/engine/abstract3drenderer.cpp') diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp index 48453a82..c5e265aa 100644 --- a/src/datavisualization/engine/abstract3drenderer.cpp +++ b/src/datavisualization/engine/abstract3drenderer.cpp @@ -138,13 +138,13 @@ void Abstract3DRenderer::render(const GLuint defaultFboHandle) glDisable(GL_SCISSOR_TEST); } -QString Abstract3DRenderer::generateValueLabel(const QString &format, float value) -{ - QString valueLabelFormat = format; - Utils::ParamType valueParamType = Utils::findFormatParamType(valueLabelFormat); - QByteArray valueFormatArray = valueLabelFormat.toUtf8(); - return Utils::formatLabel(valueFormatArray, valueParamType, value); -} +//QString Abstract3DRenderer::generateValueLabel(const QString &format, float value) +//{ +// QString valueLabelFormat = format; +// Utils::ParamType valueParamType = Utils::findFormatParamType(valueLabelFormat); +// QByteArray valueFormatArray = valueLabelFormat.toUtf8(); +// return Utils::formatLabel(valueFormatArray, valueParamType, value); +//} void Abstract3DRenderer::updateSelectionState(SelectionState state) { @@ -318,13 +318,15 @@ void Abstract3DRenderer::updateAxisRange(QAbstract3DAxis::AxisOrientation orient void Abstract3DRenderer::updateAxisSegmentCount(QAbstract3DAxis::AxisOrientation orientation, int count) { - axisCacheForOrientation(orientation).setSegmentCount(count); + AxisRenderCache &cache = axisCacheForOrientation(orientation); + cache.setSegmentCount(count); } void Abstract3DRenderer::updateAxisSubSegmentCount(QAbstract3DAxis::AxisOrientation orientation, int count) { - axisCacheForOrientation(orientation).setSubSegmentCount(count); + AxisRenderCache &cache = axisCacheForOrientation(orientation); + cache.setSubSegmentCount(count); } void Abstract3DRenderer::updateAxisLabelFormat(QAbstract3DAxis::AxisOrientation orientation, @@ -342,7 +344,7 @@ void Abstract3DRenderer::updateAxisFormatter(QAbstract3DAxis::AxisOrientation or cache.setFormatter(formatter->createNewInstance()); cache.setCtrlFormatter(formatter); } - formatter->populateCopy(*(cache.formatter())); + formatter->d_ptr->populateCopy(*(cache.formatter())); } void Abstract3DRenderer::fixMeshFileName(QString &fileName, QAbstract3DSeries::Mesh mesh) -- cgit v1.2.3 From b36b9eb7c65e3a4f6972d2f2145722470d1ad29b Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Tue, 25 Mar 2014 15:07:06 +0200 Subject: Implement QLogValue3DAxisFormatter MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task-number: QTRD-2787 Change-Id: I6ecff5c3d2047a2c566051951bf237bf3e68ffab Reviewed-by: Tomi Korpipää Reviewed-by: Mika Salmela Reviewed-by: Miikka Heikkinen --- src/datavisualization/engine/abstract3drenderer.cpp | 1 + 1 file changed, 1 insertion(+) (limited to 'src/datavisualization/engine/abstract3drenderer.cpp') diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp index c5e265aa..f0aec0cc 100644 --- a/src/datavisualization/engine/abstract3drenderer.cpp +++ b/src/datavisualization/engine/abstract3drenderer.cpp @@ -345,6 +345,7 @@ void Abstract3DRenderer::updateAxisFormatter(QAbstract3DAxis::AxisOrientation or cache.setCtrlFormatter(formatter); } formatter->d_ptr->populateCopy(*(cache.formatter())); + cache.markPositionsDirty(); } void Abstract3DRenderer::fixMeshFileName(QString &fileName, QAbstract3DSeries::Mesh mesh) -- cgit v1.2.3 From aaf51bfad10e0eac7a8ee64e36aab5f0c1119468 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Wed, 2 Apr 2014 12:16:05 +0300 Subject: Enable querying selection label via API MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Also enable suppressing drawing the label on graph. Selection label formatting was consequently moved from renderers to series. Task-number: QTRD-2896 Change-Id: Ia6a1a40298d8db0f54349de3eb27fb0b683dd302 Reviewed-by: Tomi Korpipää --- src/datavisualization/engine/abstract3drenderer.cpp | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) (limited to 'src/datavisualization/engine/abstract3drenderer.cpp') diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp index f0aec0cc..6b3393ab 100644 --- a/src/datavisualization/engine/abstract3drenderer.cpp +++ b/src/datavisualization/engine/abstract3drenderer.cpp @@ -379,14 +379,8 @@ void Abstract3DRenderer::updateSeries(const QList &seriesLi visibleCount = 0; } foreach (QAbstract3DSeries *current, seriesList) { - if (current->isVisible()) { - // Item selection label may need update - if (current->d_ptr->m_changeTracker.nameChanged - || current->d_ptr->m_changeTracker.itemLabelFormatChanged) { - m_selectionLabelDirty = true; - } + if (current->isVisible()) m_visibleSeriesList[visibleCount++].populate(current, this); - } } } -- cgit v1.2.3 From fdf486f4eb908c4471830b9a8708ebe7333b7bbe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Thu, 3 Apr 2014 12:06:54 +0300 Subject: Axis label dragging support, part 2 Task-number: QTRD-2367 + Added emitting selection signals + Added an example about creating an input handler for axis label dragging - Snapshot for example docs to be taken Change-Id: I641f4feb9e31c32023727b1c7c695324923accc4 Reviewed-by: Miikka Heikkinen --- src/datavisualization/engine/abstract3drenderer.cpp | 1 + 1 file changed, 1 insertion(+) (limited to 'src/datavisualization/engine/abstract3drenderer.cpp') diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp index 6b3393ab..38e81be6 100644 --- a/src/datavisualization/engine/abstract3drenderer.cpp +++ b/src/datavisualization/engine/abstract3drenderer.cpp @@ -46,6 +46,7 @@ Abstract3DRenderer::Abstract3DRenderer(Abstract3DController *controller) m_selectionLabelDirty(true), m_clickPending(false), m_clickedSeries(0), + m_clickedType(QAbstract3DGraph::ElementNone), m_selectionLabelItem(0) #ifdef DISPLAY_RENDER_SPEED , m_isFirstFrame(true), -- cgit v1.2.3 From 1b5d9a30adc0c9ca4f7929c375db008830586516 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Thu, 3 Apr 2014 15:05:27 +0300 Subject: Introduce fps measurement via properties MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task-number: QTRD-2134 Change-Id: I181ee6c784b998886c2292b7548e16ce75d86458 Reviewed-by: Tomi Korpipää --- .../engine/abstract3drenderer.cpp | 29 ---------------------- 1 file changed, 29 deletions(-) (limited to 'src/datavisualization/engine/abstract3drenderer.cpp') diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp index 38e81be6..0b8ac8d1 100644 --- a/src/datavisualization/engine/abstract3drenderer.cpp +++ b/src/datavisualization/engine/abstract3drenderer.cpp @@ -48,10 +48,6 @@ Abstract3DRenderer::Abstract3DRenderer(Abstract3DController *controller) m_clickedSeries(0), m_clickedType(QAbstract3DGraph::ElementNone), m_selectionLabelItem(0) -#ifdef DISPLAY_RENDER_SPEED - , m_isFirstFrame(true), - m_numFrames(0) -#endif { QObject::connect(m_drawer, &Drawer::drawerChanged, this, &Abstract3DRenderer::updateTextures); @@ -97,23 +93,6 @@ void Abstract3DRenderer::initializeOpenGL() void Abstract3DRenderer::render(const GLuint defaultFboHandle) { -#ifdef DISPLAY_RENDER_SPEED - // For speed computation - if (m_isFirstFrame) { - m_lastFrameTime.start(); - m_isFirstFrame = false; - } - - // Measure speed (as milliseconds per frame) - m_numFrames++; - if (m_lastFrameTime.elapsed() >= 1000) { // print only if last measurement was more than 1s ago - qDebug() << float(m_lastFrameTime.elapsed()) / float(m_numFrames) << "ms/frame (=" - << float(m_numFrames) << "fps)"; - m_numFrames = 0; - m_lastFrameTime.restart(); - } -#endif - if (defaultFboHandle) { glDepthMask(true); glEnable(GL_DEPTH_TEST); @@ -139,14 +118,6 @@ void Abstract3DRenderer::render(const GLuint defaultFboHandle) glDisable(GL_SCISSOR_TEST); } -//QString Abstract3DRenderer::generateValueLabel(const QString &format, float value) -//{ -// QString valueLabelFormat = format; -// Utils::ParamType valueParamType = Utils::findFormatParamType(valueLabelFormat); -// QByteArray valueFormatArray = valueLabelFormat.toUtf8(); -// return Utils::formatLabel(valueFormatArray, valueParamType, value); -//} - void Abstract3DRenderer::updateSelectionState(SelectionState state) { m_selectionState = state; -- cgit v1.2.3 From 28e42188efb1544cf6b1433c244d590165ee6ebd Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Mon, 7 Apr 2014 14:26:32 +0300 Subject: Optimize multiple series rendering. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cache all series instead of just the visible ones on all graphs instead of just surface. Changes to one series now trigger data update to only the affected series, which should significantly improve performance in these cases. Task-number: QTRD-2600 Task-number: QTRD-2957 Change-Id: I6db7c689108fce8d25aace6682a193936d6f0eaf Reviewed-by: Tomi Korpipää --- .../engine/abstract3drenderer.cpp | 83 +++++++++++++++------- 1 file changed, 57 insertions(+), 26 deletions(-) (limited to 'src/datavisualization/engine/abstract3drenderer.cpp') diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp index 0b8ac8d1..f70d128b 100644 --- a/src/datavisualization/engine/abstract3drenderer.cpp +++ b/src/datavisualization/engine/abstract3drenderer.cpp @@ -47,7 +47,8 @@ Abstract3DRenderer::Abstract3DRenderer(Abstract3DController *controller) m_clickPending(false), m_clickedSeries(0), m_clickedType(QAbstract3DGraph::ElementNone), - m_selectionLabelItem(0) + m_selectionLabelItem(0), + m_visibleSeriesCount(0) { QObject::connect(m_drawer, &Drawer::drawerChanged, this, &Abstract3DRenderer::updateTextures); @@ -59,14 +60,17 @@ Abstract3DRenderer::Abstract3DRenderer(Abstract3DController *controller) Abstract3DRenderer::~Abstract3DRenderer() { - for (int i = 0; i < m_visibleSeriesList.size(); i++) - m_visibleSeriesList[i].cleanup(m_textureHelper); - delete m_drawer; delete m_textureHelper; delete m_cachedScene; delete m_cachedTheme; delete m_selectionLabelItem; + + foreach (SeriesRenderCache *cache, m_renderCacheList) { + cache->cleanup(m_textureHelper); + delete cache; + } + m_renderCacheList.clear(); } void Abstract3DRenderer::initializeOpenGL() @@ -285,6 +289,9 @@ void Abstract3DRenderer::updateAxisRange(QAbstract3DAxis::AxisOrientation orient AxisRenderCache &cache = axisCacheForOrientation(orientation); cache.setMin(min); cache.setMax(max); + + foreach (SeriesRenderCache *cache, m_renderCacheList) + cache->setDataDirty(true); } void Abstract3DRenderer::updateAxisSegmentCount(QAbstract3DAxis::AxisOrientation orientation, @@ -318,6 +325,18 @@ void Abstract3DRenderer::updateAxisFormatter(QAbstract3DAxis::AxisOrientation or } formatter->d_ptr->populateCopy(*(cache.formatter())); cache.markPositionsDirty(); + + foreach (SeriesRenderCache *cache, m_renderCacheList) + cache->setDataDirty(true); +} + +void Abstract3DRenderer::modifiedSeriesList(const QVector &seriesList) +{ + foreach (QAbstract3DSeries *series, seriesList) { + SeriesRenderCache *cache = m_renderCacheList.value(series, 0); + if (cache) + cache->setDataDirty(true); + } } void Abstract3DRenderer::fixMeshFileName(QString &fileName, QAbstract3DSeries::Mesh mesh) @@ -327,33 +346,45 @@ void Abstract3DRenderer::fixMeshFileName(QString &fileName, QAbstract3DSeries::M Q_UNUSED(mesh) } -void Abstract3DRenderer::updateSeries(const QList &seriesList, - bool updateVisibility) +void Abstract3DRenderer::updateSeries(const QList &seriesList) { - int visibleCount = 0; - if (updateVisibility) { - int oldSize = m_visibleSeriesList.size(); - foreach (QAbstract3DSeries *current, seriesList) { - if (current->isVisible()) - visibleCount++; + foreach (SeriesRenderCache *cache, m_renderCacheList) + cache->setValid(false); + + m_visibleSeriesCount = 0; + int seriesCount = seriesList.size(); + for (int i = 0; i < seriesCount; i++) { + QAbstract3DSeries *series = seriesList.at(i); + SeriesRenderCache *cache = m_renderCacheList.value(series); + bool newSeries = false; + if (!cache) { + cache = createNewCache(series); + m_renderCacheList[series] = cache; + newSeries = true; } + cache->setValid(true); + cache->populate(newSeries); + if (cache->isVisible()) + m_visibleSeriesCount++; + } - // Clean up series caches that are about to be permanently deleted. - // Can't just use cache destructor, as resize will call that to all items. - if (visibleCount < oldSize) { - for (int i = visibleCount; i < oldSize; i++) - m_visibleSeriesList[i].cleanup(m_textureHelper); - } + // Remove non-valid objects from the cache list + foreach (SeriesRenderCache *cache, m_renderCacheList) { + if (!cache->isValid()) + cleanCache(cache); + } +} - if (visibleCount != oldSize) - m_visibleSeriesList.resize(visibleCount); +SeriesRenderCache *Abstract3DRenderer::createNewCache(QAbstract3DSeries *series) +{ + return new SeriesRenderCache(series, this); +} - visibleCount = 0; - } - foreach (QAbstract3DSeries *current, seriesList) { - if (current->isVisible()) - m_visibleSeriesList[visibleCount++].populate(current, this); - } +void Abstract3DRenderer::cleanCache(SeriesRenderCache *cache) +{ + m_renderCacheList.remove(cache->series()); + cache->cleanup(m_textureHelper); + delete cache; } AxisRenderCache &Abstract3DRenderer::axisCacheForOrientation( -- cgit v1.2.3 From a30c0c304e55ffe30545ab0838e4dbe11a99b8da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Tue, 15 Apr 2014 10:32:03 +0300 Subject: Add custom item support, part 1 Task-number: QTRD-2866 + Added API for adding and removing custom items + Added custom data and custom render items + Added shaders for textured objects + Added custom item rendering draft to scatter + Fixed some shaders - to be continued in part 2 Change-Id: I9735fd02fc9e86ae486cca4c06f6d7f2a4b0b7da Reviewed-by: Mika Salmela --- src/datavisualization/engine/abstract3drenderer.cpp | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) (limited to 'src/datavisualization/engine/abstract3drenderer.cpp') diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp index f70d128b..1cb4bdba 100644 --- a/src/datavisualization/engine/abstract3drenderer.cpp +++ b/src/datavisualization/engine/abstract3drenderer.cpp @@ -27,6 +27,7 @@ #include "q3dtheme_p.h" #include "objecthelper_p.h" #include "qvalue3daxisformatter_p.h" +#include "shaderhelper_p.h" QT_BEGIN_NAMESPACE_DATAVISUALIZATION @@ -48,7 +49,8 @@ Abstract3DRenderer::Abstract3DRenderer(Abstract3DController *controller) m_clickedSeries(0), m_clickedType(QAbstract3DGraph::ElementNone), m_selectionLabelItem(0), - m_visibleSeriesCount(0) + m_visibleSeriesCount(0), + m_customItemShader(0) { QObject::connect(m_drawer, &Drawer::drawerChanged, this, &Abstract3DRenderer::updateTextures); @@ -65,6 +67,7 @@ Abstract3DRenderer::~Abstract3DRenderer() delete m_cachedScene; delete m_cachedTheme; delete m_selectionLabelItem; + delete m_customItemShader; foreach (SeriesRenderCache *cache, m_renderCacheList) { cache->cleanup(m_textureHelper); @@ -140,6 +143,15 @@ void Abstract3DRenderer::initGradientShaders(const QString &vertexShader, Q_UNUSED(fragmentShader) } +void Abstract3DRenderer::initCustomItemShaders(const QString &vertexShader, + const QString &fragmentShader) +{ + if (m_customItemShader) + delete m_customItemShader; + m_customItemShader = new ShaderHelper(this, vertexShader, fragmentShader); + m_customItemShader->initialize(); +} + void Abstract3DRenderer::updateTheme(Q3DTheme *theme) { // Synchronize the controller theme with renderer @@ -206,6 +218,8 @@ void Abstract3DRenderer::reInitShaders() QStringLiteral(":/shaders/fragmentShadowNoTex")); initBackgroundShaders(QStringLiteral(":/shaders/vertexShadow"), QStringLiteral(":/shaders/fragmentShadowNoTex")); + initCustomItemShaders(QStringLiteral(":/shaders/vertexShadow"), + QStringLiteral(":/shaders/fragmentShadow")); } else { initGradientShaders(QStringLiteral(":/shaders/vertex"), QStringLiteral(":/shaders/fragmentColorOnY")); @@ -213,6 +227,8 @@ void Abstract3DRenderer::reInitShaders() QStringLiteral(":/shaders/fragment")); initBackgroundShaders(QStringLiteral(":/shaders/vertex"), QStringLiteral(":/shaders/fragment")); + initCustomItemShaders(QStringLiteral(":/shaders/vertexShadow"), + QStringLiteral(":/shaders/fragmentTexture")); } #else initGradientShaders(QStringLiteral(":/shaders/vertex"), @@ -221,6 +237,8 @@ void Abstract3DRenderer::reInitShaders() QStringLiteral(":/shaders/fragmentES2")); initBackgroundShaders(QStringLiteral(":/shaders/vertex"), QStringLiteral(":/shaders/fragmentES2")); + initCustomItemShaders(QStringLiteral(":/shaders/vertex"), // TODO: Need new shader? At least this one doesn't work + QStringLiteral(":/shaders/fragmentTextureES2")); #endif } -- cgit v1.2.3 From bf8ed99fb5a474aa6a56d61c9e3a1b5e44d6b6cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Wed, 16 Apr 2014 12:25:14 +0300 Subject: Add custom item support, part 2 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task-number: QTRD-2866 + Added custom item rendering Change-Id: If24400fed7c0467d8ebbd554d6e4df3ec5a205f3 Reviewed-by: Tomi Korpipää --- .../engine/abstract3drenderer.cpp | 120 ++++++++++++++++++++- 1 file changed, 118 insertions(+), 2 deletions(-) (limited to 'src/datavisualization/engine/abstract3drenderer.cpp') diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp index 1cb4bdba..d18a1fc3 100644 --- a/src/datavisualization/engine/abstract3drenderer.cpp +++ b/src/datavisualization/engine/abstract3drenderer.cpp @@ -227,7 +227,7 @@ void Abstract3DRenderer::reInitShaders() QStringLiteral(":/shaders/fragment")); initBackgroundShaders(QStringLiteral(":/shaders/vertex"), QStringLiteral(":/shaders/fragment")); - initCustomItemShaders(QStringLiteral(":/shaders/vertexShadow"), + initCustomItemShaders(QStringLiteral(":/shaders/vertexTexture"), QStringLiteral(":/shaders/fragmentTexture")); } #else @@ -237,7 +237,7 @@ void Abstract3DRenderer::reInitShaders() QStringLiteral(":/shaders/fragmentES2")); initBackgroundShaders(QStringLiteral(":/shaders/vertex"), QStringLiteral(":/shaders/fragmentES2")); - initCustomItemShaders(QStringLiteral(":/shaders/vertex"), // TODO: Need new shader? At least this one doesn't work + initCustomItemShaders(QStringLiteral(":/shaders/vertexTexture"), QStringLiteral(":/shaders/fragmentTextureES2")); #endif } @@ -393,6 +393,19 @@ void Abstract3DRenderer::updateSeries(const QList &seriesLi } } +void Abstract3DRenderer::updateCustomData(const QList &customItems) +{ + if (customItems.isEmpty() && m_customRenderCache.isEmpty()) + return; + + // There are probably not too many custom items, just recreate the array if something changes + foreach (CustomRenderItem *item, m_customRenderCache) + delete item; + m_customRenderCache.clear(); + foreach (CustomDataItem *item, customItems) + addCustomItem(item); +} + SeriesRenderCache *Abstract3DRenderer::createNewCache(QAbstract3DSeries *series) { return new SeriesRenderCache(series, this); @@ -502,4 +515,107 @@ QString &Abstract3DRenderer::selectionLabel() return m_selectionLabel; } +QVector4D Abstract3DRenderer::indexToSelectionColor(GLint index) +{ + GLubyte idxRed = index & 0xff; + GLubyte idxGreen = (index & 0xff00) >> 8; + GLubyte idxBlue = (index & 0xff0000) >> 16; + + return QVector4D(idxRed, idxGreen, idxBlue, 0); +} + +void Abstract3DRenderer::addCustomItem(CustomDataItem *item) { + CustomRenderItem *newItem = new CustomRenderItem(); + newItem->setMesh(item->meshFile()); + newItem->setScaling(item->scaling()); + newItem->setRotation(item->rotation()); + newItem->setTexture(item->texture()); + QVector3D translation = convertPositionToTranslation(item->position()); + newItem->setTranslation(translation); + m_customRenderCache.append(newItem); +} + +void Abstract3DRenderer::drawCustomItems(RenderingState state, + ShaderHelper *shader, + const QMatrix4x4 &viewMatrix, + const QMatrix4x4 &projectionViewMatrix, + const QMatrix4x4 &depthProjectionViewMatrix, + GLuint depthTexture, + GLfloat shadowQuality) +{ + if (m_customRenderCache.isEmpty()) + return; + + int itemIndex = 0; + + if (RenderingNormal == state) { + shader->bind(); + shader->setUniformValue(shader->lightP(), m_cachedScene->activeLight()->position()); + shader->setUniformValue(shader->ambientS(), m_cachedTheme->ambientLightStrength()); + shader->setUniformValue(shader->lightColor(), + Utils::vectorFromColor(m_cachedTheme->lightColor())); + shader->setUniformValue(shader->view(), viewMatrix); + + glEnable(GL_TEXTURE_2D); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + } + + // Draw custom items + foreach (CustomRenderItem *item, m_customRenderCache) { + QMatrix4x4 modelMatrix; + QMatrix4x4 itModelMatrix; + QMatrix4x4 MVPMatrix; + + modelMatrix.translate(item->translation()); + modelMatrix.rotate(item->rotation()); + modelMatrix.scale(item->scaling()); + itModelMatrix.rotate(item->rotation()); + itModelMatrix.scale(item->scaling()); + MVPMatrix = projectionViewMatrix * modelMatrix; + + if (RenderingNormal == state) { + // Normal render + shader->setUniformValue(shader->model(), modelMatrix); + shader->setUniformValue(shader->MVP(), MVPMatrix); + shader->setUniformValue(shader->nModel(), itModelMatrix.inverted().transposed()); + +#if !defined(QT_OPENGL_ES_2) + if (m_cachedShadowQuality > QAbstract3DGraph::ShadowQualityNone) { + // Set shadow shader bindings + shader->setUniformValue(shader->shadowQ(), shadowQuality); + shader->setUniformValue(shader->depth(), depthProjectionViewMatrix * modelMatrix); + shader->setUniformValue(shader->lightS(), m_cachedTheme->lightStrength() / 10.0f); + m_drawer->drawObject(shader, item->mesh(), item->texture(), depthTexture); + } else +#else + Q_UNUSED(depthTexture) + Q_UNUSED(shadowQuality) +#endif + { + // Set shadowless shader bindings + shader->setUniformValue(shader->lightS(), m_cachedTheme->lightStrength()); + m_drawer->drawObject(shader, item->mesh(), item->texture()); + } + } else if (RenderingSelection == state) { + // Selection render + shader->setUniformValue(shader->MVP(), MVPMatrix); + QVector4D itemColor = indexToSelectionColor(itemIndex++); + itemColor.setW(customItemAlpha); + itemColor /= 255.0f; + shader->setUniformValue(shader->color(), itemColor); + m_drawer->drawObject(shader, item->mesh()); + } else { + // Depth render + shader->setUniformValue(shader->MVP(), depthProjectionViewMatrix * modelMatrix); + m_drawer->drawObject(shader, item->mesh()); + } + } + + if (RenderingNormal == state) { + glDisable(GL_TEXTURE_2D); + glDisable(GL_BLEND); + } +} + QT_END_NAMESPACE_DATAVISUALIZATION -- cgit v1.2.3 From 2b19a3ae8b8c34ea674058c7b82de44397e29df2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Thu, 24 Apr 2014 07:37:58 +0300 Subject: Color problem fixed Task-number: QTRD-3001 Changed all colors to QVector4Ds to avoid mixups with vec4 and vec3 colors in shaders. Change-Id: I8b44b4d711befca900dd35b3386881f7c31d7dd5 Change-Id: I8b44b4d711befca900dd35b3386881f7c31d7dd5 Reviewed-by: Mika Salmela --- src/datavisualization/engine/abstract3drenderer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/datavisualization/engine/abstract3drenderer.cpp') diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp index d18a1fc3..af92c691 100644 --- a/src/datavisualization/engine/abstract3drenderer.cpp +++ b/src/datavisualization/engine/abstract3drenderer.cpp @@ -119,7 +119,7 @@ void Abstract3DRenderer::render(const GLuint defaultFboHandle) m_viewport.width(), m_viewport.height()); glEnable(GL_SCISSOR_TEST); - QVector3D clearColor = Utils::vectorFromColor(m_cachedTheme->windowColor()); + QVector4D clearColor = Utils::vectorFromColor(m_cachedTheme->windowColor()); glClearColor(clearColor.x(), clearColor.y(), clearColor.z(), 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glDisable(GL_SCISSOR_TEST); -- cgit v1.2.3 From aea77bbc83b353c0513915b220b856c28831caa6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Fri, 25 Apr 2014 07:47:38 +0300 Subject: Fixed crash on exit Task-number: QTRD-3052 Change-Id: I05b09df72534e5eae803d58e330b2a8045f47038 Change-Id: I05b09df72534e5eae803d58e330b2a8045f47038 Reviewed-by: Titta Heikkala --- src/datavisualization/engine/abstract3drenderer.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'src/datavisualization/engine/abstract3drenderer.cpp') diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp index af92c691..458630ed 100644 --- a/src/datavisualization/engine/abstract3drenderer.cpp +++ b/src/datavisualization/engine/abstract3drenderer.cpp @@ -63,7 +63,6 @@ Abstract3DRenderer::Abstract3DRenderer(Abstract3DController *controller) Abstract3DRenderer::~Abstract3DRenderer() { delete m_drawer; - delete m_textureHelper; delete m_cachedScene; delete m_cachedTheme; delete m_selectionLabelItem; @@ -74,6 +73,8 @@ Abstract3DRenderer::~Abstract3DRenderer() delete cache; } m_renderCacheList.clear(); + + delete m_textureHelper; } void Abstract3DRenderer::initializeOpenGL() -- cgit v1.2.3 From d5fe794178f755a259e7680bbf11571785abe14d Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Mon, 28 Apr 2014 09:31:10 +0300 Subject: Fix texture cleanup. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Make deleteTexture also zero the pointer and do the check if deletion is needed, as those are required anyway on the caller side in most cases. Change-Id: Ia12102c97a647127230db2518c32f81322ce6743 Reviewed-by: Tomi Korpipää --- src/datavisualization/engine/abstract3drenderer.cpp | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) (limited to 'src/datavisualization/engine/abstract3drenderer.cpp') diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp index 458630ed..bd19959b 100644 --- a/src/datavisualization/engine/abstract3drenderer.cpp +++ b/src/datavisualization/engine/abstract3drenderer.cpp @@ -475,11 +475,7 @@ void Abstract3DRenderer::lowerShadowQuality() void Abstract3DRenderer::generateBaseColorTexture(const QColor &color, GLuint *texture) { - if (*texture) { - m_textureHelper->deleteTexture(texture); - *texture = 0; - } - + m_textureHelper->deleteTexture(texture); *texture = m_textureHelper->createUniformTexture(color); } @@ -489,10 +485,7 @@ void Abstract3DRenderer::fixGradientAndGenerateTexture(QLinearGradient *gradient gradient->setStart(qreal(gradientTextureWidth), qreal(gradientTextureHeight)); gradient->setFinalStop(0.0, 0.0); - if (*gradientTexture) { - m_textureHelper->deleteTexture(gradientTexture); - *gradientTexture = 0; - } + m_textureHelper->deleteTexture(gradientTexture); *gradientTexture = m_textureHelper->createGradientTexture(*gradient); } -- cgit v1.2.3 From 8ff45fe94c3f3f6916f8f673c3ce0b574a69cfdf Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Tue, 6 May 2014 09:52:24 +0300 Subject: Value axis reversing support Task-number: QTRD-2428 Change-Id: I51b3a1f8f974d5b72b36ee1188b7557539b9609b Reviewed-by: Titta Heikkala Reviewed-by: Mika Salmela --- src/datavisualization/engine/abstract3drenderer.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'src/datavisualization/engine/abstract3drenderer.cpp') diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp index bd19959b..95cecbd3 100644 --- a/src/datavisualization/engine/abstract3drenderer.cpp +++ b/src/datavisualization/engine/abstract3drenderer.cpp @@ -333,6 +333,14 @@ void Abstract3DRenderer::updateAxisLabelFormat(QAbstract3DAxis::AxisOrientation axisCacheForOrientation(orientation).setLabelFormat(format); } +void Abstract3DRenderer::updateAxisReversed(QAbstract3DAxis::AxisOrientation orientation, + bool enable) +{ + axisCacheForOrientation(orientation).setReversed(enable); + foreach (SeriesRenderCache *cache, m_renderCacheList) + cache->setDataDirty(true); +} + void Abstract3DRenderer::updateAxisFormatter(QAbstract3DAxis::AxisOrientation orientation, QValue3DAxisFormatter *formatter) { -- cgit v1.2.3 From 6880277f23b47117f7788f08f855ed99b5120f9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Mon, 12 May 2014 10:06:27 +0300 Subject: CustomDataItem made into a public class MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task-number: QTRD-3055 Change-Id: I1e449df7c1bcb48fc639dbae579e2e1499c9ef2b Reviewed-by: Tomi Korpipää --- .../engine/abstract3drenderer.cpp | 25 +++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) (limited to 'src/datavisualization/engine/abstract3drenderer.cpp') diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp index 95cecbd3..bff24bc7 100644 --- a/src/datavisualization/engine/abstract3drenderer.cpp +++ b/src/datavisualization/engine/abstract3drenderer.cpp @@ -28,6 +28,7 @@ #include "objecthelper_p.h" #include "qvalue3daxisformatter_p.h" #include "shaderhelper_p.h" +#include "qcustom3ditem_p.h" QT_BEGIN_NAMESPACE_DATAVISUALIZATION @@ -74,6 +75,13 @@ Abstract3DRenderer::~Abstract3DRenderer() } m_renderCacheList.clear(); + foreach (CustomRenderItem *item, m_customRenderCache) { + GLuint texture = item->texture(); + m_textureHelper->deleteTexture(&texture); + delete item; + } + m_customRenderCache.clear(); + delete m_textureHelper; } @@ -402,16 +410,19 @@ void Abstract3DRenderer::updateSeries(const QList &seriesLi } } -void Abstract3DRenderer::updateCustomData(const QList &customItems) +void Abstract3DRenderer::updateCustomData(const QList &customItems) { if (customItems.isEmpty() && m_customRenderCache.isEmpty()) return; // There are probably not too many custom items, just recreate the array if something changes - foreach (CustomRenderItem *item, m_customRenderCache) + foreach (CustomRenderItem *item, m_customRenderCache) { + GLuint texture = item->texture(); + m_textureHelper->deleteTexture(&texture); delete item; + } m_customRenderCache.clear(); - foreach (CustomDataItem *item, customItems) + foreach (QCustom3DItem *item, customItems) addCustomItem(item); } @@ -526,12 +537,16 @@ QVector4D Abstract3DRenderer::indexToSelectionColor(GLint index) return QVector4D(idxRed, idxGreen, idxBlue, 0); } -void Abstract3DRenderer::addCustomItem(CustomDataItem *item) { +void Abstract3DRenderer::addCustomItem(QCustom3DItem *item) { CustomRenderItem *newItem = new CustomRenderItem(); newItem->setMesh(item->meshFile()); newItem->setScaling(item->scaling()); newItem->setRotation(item->rotation()); - newItem->setTexture(item->texture()); + GLuint texture = m_textureHelper->create2DTexture(item->d_ptr->textureImage(), + true, true, true); + newItem->setTexture(texture); + // TODO: Uncomment this once custom item render cache handling has been optimized + //item->d_ptr->clearTextureImage(); QVector3D translation = convertPositionToTranslation(item->position()); newItem->setTranslation(translation); m_customRenderCache.append(newItem); -- cgit v1.2.3 From c5e993ad507cc0d56d0e2a62076584d020086ad7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Wed, 14 May 2014 07:33:23 +0300 Subject: Use blending for custom items only when needed Task-number: QTRD-3077 Change-Id: I2406a8fd133943379a5cb1c1c2961a419ef9315f Reviewed-by: Titta Heikkala Reviewed-by: Miikka Heikkinen --- src/datavisualization/engine/abstract3drenderer.cpp | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) (limited to 'src/datavisualization/engine/abstract3drenderer.cpp') diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp index bff24bc7..6fde5f20 100644 --- a/src/datavisualization/engine/abstract3drenderer.cpp +++ b/src/datavisualization/engine/abstract3drenderer.cpp @@ -542,10 +542,11 @@ void Abstract3DRenderer::addCustomItem(QCustom3DItem *item) { newItem->setMesh(item->meshFile()); newItem->setScaling(item->scaling()); newItem->setRotation(item->rotation()); - GLuint texture = m_textureHelper->create2DTexture(item->d_ptr->textureImage(), - true, true, true); + QImage textureImage = item->d_ptr->textureImage(); + newItem->setBlendNeeded(textureImage.hasAlphaChannel()); + GLuint texture = m_textureHelper->create2DTexture(textureImage, true, true, true); newItem->setTexture(texture); - // TODO: Uncomment this once custom item render cache handling has been optimized + // TODO: Uncomment this once custom item render cache handling has been optimized (QTRD-3056) //item->d_ptr->clearTextureImage(); QVector3D translation = convertPositionToTranslation(item->position()); newItem->setTranslation(translation); @@ -574,8 +575,6 @@ void Abstract3DRenderer::drawCustomItems(RenderingState state, shader->setUniformValue(shader->view(), viewMatrix); glEnable(GL_TEXTURE_2D); - glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); } // Draw custom items @@ -597,6 +596,15 @@ void Abstract3DRenderer::drawCustomItems(RenderingState state, shader->setUniformValue(shader->MVP(), MVPMatrix); shader->setUniformValue(shader->nModel(), itModelMatrix.inverted().transposed()); + if (item->isBlendNeeded()) { + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glDisable(GL_CULL_FACE); + } else { + glDisable(GL_BLEND); + glEnable(GL_CULL_FACE); + } + #if !defined(QT_OPENGL_ES_2) if (m_cachedShadowQuality > QAbstract3DGraph::ShadowQualityNone) { // Set shadow shader bindings @@ -632,6 +640,7 @@ void Abstract3DRenderer::drawCustomItems(RenderingState state, if (RenderingNormal == state) { glDisable(GL_TEXTURE_2D); glDisable(GL_BLEND); + glEnable(GL_CULL_FACE); } } -- cgit v1.2.3 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 --- src/datavisualization/engine/abstract3drenderer.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'src/datavisualization/engine/abstract3drenderer.cpp') 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); -- cgit v1.2.3 From 8015a58ea819b41e0a896ea9e7d57d7f3a9f1c5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Wed, 14 May 2014 13:40:35 +0300 Subject: Added visible flag and possibility to release ownership of custom item Task-number: QTRD-3080 Change-Id: I198930c48fe9bce6a158406aff5fbf31272b9afe Reviewed-by: Miikka Heikkinen --- src/datavisualization/engine/abstract3drenderer.cpp | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'src/datavisualization/engine/abstract3drenderer.cpp') diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp index bcf03ed7..6dcc46df 100644 --- a/src/datavisualization/engine/abstract3drenderer.cpp +++ b/src/datavisualization/engine/abstract3drenderer.cpp @@ -551,6 +551,7 @@ void Abstract3DRenderer::addCustomItem(QCustom3DItem *item) { //item->d_ptr->clearTextureImage(); QVector3D translation = convertPositionToTranslation(item->position()); newItem->setTranslation(translation); + newItem->setVisible(item->isVisible()); m_customRenderCache.append(newItem); } @@ -580,6 +581,9 @@ void Abstract3DRenderer::drawCustomItems(RenderingState state, // Draw custom items foreach (CustomRenderItem *item, m_customRenderCache) { + if (!item->isVisible()) + continue; + QMatrix4x4 modelMatrix; QMatrix4x4 itModelMatrix; QMatrix4x4 MVPMatrix; -- cgit v1.2.3 From 6368dd9a1d9e51016dcef9c93137526c07adcbeb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Thu, 15 May 2014 12:01:47 +0300 Subject: Dirty bits to custom item Task-number: QTRD-3082 Change-Id: I1503b067edcc677904ca16c1501109187809f98b Change-Id: I1503b067edcc677904ca16c1501109187809f98b Reviewed-by: Miikka Heikkinen --- .../engine/abstract3drenderer.cpp | 49 +++++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) (limited to 'src/datavisualization/engine/abstract3drenderer.cpp') diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp index 6dcc46df..920b8cf0 100644 --- a/src/datavisualization/engine/abstract3drenderer.cpp +++ b/src/datavisualization/engine/abstract3drenderer.cpp @@ -427,6 +427,14 @@ void Abstract3DRenderer::updateCustomData(const QList &customIt addCustomItem(item); } +void Abstract3DRenderer::updateCustomItems() +{ + // Check all items + // TODO: Call updateCustomItem in a loop, as we can probably utilize the same function in updateCustomData when doing QTRD-3056 + foreach (CustomRenderItem *item, m_customRenderCache) + updateCustomItem(item); +} + SeriesRenderCache *Abstract3DRenderer::createNewCache(QAbstract3DSeries *series) { return new SeriesRenderCache(series, this); @@ -538,8 +546,10 @@ QVector4D Abstract3DRenderer::indexToSelectionColor(GLint index) return QVector4D(idxRed, idxGreen, idxBlue, 0); } -void Abstract3DRenderer::addCustomItem(QCustom3DItem *item) { +void Abstract3DRenderer::addCustomItem(QCustom3DItem *item) +{ CustomRenderItem *newItem = new CustomRenderItem(); + newItem->setItemPointer(item); // Store pointer for render item updates newItem->setMesh(item->meshFile()); newItem->setScaling(item->scaling()); newItem->setRotation(item->rotation()); @@ -555,6 +565,43 @@ void Abstract3DRenderer::addCustomItem(QCustom3DItem *item) { m_customRenderCache.append(newItem); } +void Abstract3DRenderer::updateCustomItem(CustomRenderItem *renderItem) +{ + QCustom3DItem *item = renderItem->itemPointer(); + if (item->d_ptr->m_dirtyBits.meshDirty) { + renderItem->setMesh(item->meshFile()); + item->d_ptr->m_dirtyBits.meshDirty = false; + } + if (item->d_ptr->m_dirtyBits.scalingDirty) { + renderItem->setScaling(item->scaling()); + item->d_ptr->m_dirtyBits.scalingDirty = false; + } + if (item->d_ptr->m_dirtyBits.rotationDirty) { + renderItem->setRotation(item->rotation()); + item->d_ptr->m_dirtyBits.rotationDirty = false; + } + if (item->d_ptr->m_dirtyBits.textureDirty) { + QImage textureImage = item->d_ptr->textureImage(); + renderItem->setBlendNeeded(textureImage.hasAlphaChannel()); + GLuint oldTexture = renderItem->texture(); + m_textureHelper->deleteTexture(&oldTexture); + GLuint texture = m_textureHelper->create2DTexture(textureImage, true, true, true); + renderItem->setTexture(texture); + // TODO: Uncomment this once custom item render cache handling has been optimized (QTRD-3056) + //item->d_ptr->clearTextureImage(); + item->d_ptr->m_dirtyBits.textureDirty = false; + } + if (item->d_ptr->m_dirtyBits.positionDirty) { + QVector3D translation = convertPositionToTranslation(item->position()); + renderItem->setTranslation(translation); + item->d_ptr->m_dirtyBits.positionDirty = false; + } + if (item->d_ptr->m_dirtyBits.visibleDirty) { + renderItem->setVisible(item->isVisible()); + item->d_ptr->m_dirtyBits.visibleDirty = false; + } +} + void Abstract3DRenderer::drawCustomItems(RenderingState state, ShaderHelper *shader, const QMatrix4x4 &viewMatrix, -- cgit v1.2.3 From a998e49b3455c9e28d2ed85f024f28c69921cfd2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Mon, 19 May 2014 08:39:47 +0300 Subject: Optimized custom item addition/removal Task-number: QTRD-3056 Change-Id: I653d8aeec797b76c19d9b542391b79e9370e7501 Reviewed-by: Miikka Heikkinen --- .../engine/abstract3drenderer.cpp | 46 +++++++++++++--------- 1 file changed, 28 insertions(+), 18 deletions(-) (limited to 'src/datavisualization/engine/abstract3drenderer.cpp') diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp index 920b8cf0..06954165 100644 --- a/src/datavisualization/engine/abstract3drenderer.cpp +++ b/src/datavisualization/engine/abstract3drenderer.cpp @@ -416,21 +416,34 @@ void Abstract3DRenderer::updateCustomData(const QList &customIt if (customItems.isEmpty() && m_customRenderCache.isEmpty()) return; - // There are probably not too many custom items, just recreate the array if something changes - foreach (CustomRenderItem *item, m_customRenderCache) { - GLuint texture = item->texture(); - m_textureHelper->deleteTexture(&texture); - delete item; + foreach (CustomRenderItem *item, m_customRenderCache) + item->setValid(false); + + int itemCount = customItems.size(); + // Check custom item list for items that are not yet in render item cache + for (int i = 0; i < itemCount; i++) { + QCustom3DItem *item = customItems.at(i); + CustomRenderItem *renderItem = m_customRenderCache.value(item); + if (!renderItem) + renderItem = addCustomItem(item); + renderItem->setValid(true); + renderItem->setIndex(i); // always update index, as it must match the custom item index + } + + // Check render item cache and remove items that are not in customItems list anymore + foreach (CustomRenderItem *renderItem, m_customRenderCache) { + if (!renderItem->isValid()) { + m_customRenderCache.remove(renderItem->itemPointer()); + GLuint texture = renderItem->texture(); + m_textureHelper->deleteTexture(&texture); + delete renderItem; + } } - m_customRenderCache.clear(); - foreach (QCustom3DItem *item, customItems) - addCustomItem(item); } void Abstract3DRenderer::updateCustomItems() { // Check all items - // TODO: Call updateCustomItem in a loop, as we can probably utilize the same function in updateCustomData when doing QTRD-3056 foreach (CustomRenderItem *item, m_customRenderCache) updateCustomItem(item); } @@ -546,7 +559,7 @@ QVector4D Abstract3DRenderer::indexToSelectionColor(GLint index) return QVector4D(idxRed, idxGreen, idxBlue, 0); } -void Abstract3DRenderer::addCustomItem(QCustom3DItem *item) +CustomRenderItem *Abstract3DRenderer::addCustomItem(QCustom3DItem *item) { CustomRenderItem *newItem = new CustomRenderItem(); newItem->setItemPointer(item); // Store pointer for render item updates @@ -557,12 +570,12 @@ void Abstract3DRenderer::addCustomItem(QCustom3DItem *item) newItem->setBlendNeeded(textureImage.hasAlphaChannel()); GLuint texture = m_textureHelper->create2DTexture(textureImage, true, true, true); newItem->setTexture(texture); - // TODO: Uncomment this once custom item render cache handling has been optimized (QTRD-3056) - //item->d_ptr->clearTextureImage(); + item->d_ptr->clearTextureImage(); QVector3D translation = convertPositionToTranslation(item->position()); newItem->setTranslation(translation); newItem->setVisible(item->isVisible()); - m_customRenderCache.append(newItem); + m_customRenderCache.insert(item, newItem); + return newItem; } void Abstract3DRenderer::updateCustomItem(CustomRenderItem *renderItem) @@ -587,8 +600,7 @@ void Abstract3DRenderer::updateCustomItem(CustomRenderItem *renderItem) m_textureHelper->deleteTexture(&oldTexture); GLuint texture = m_textureHelper->create2DTexture(textureImage, true, true, true); renderItem->setTexture(texture); - // TODO: Uncomment this once custom item render cache handling has been optimized (QTRD-3056) - //item->d_ptr->clearTextureImage(); + item->d_ptr->clearTextureImage(); item->d_ptr->m_dirtyBits.textureDirty = false; } if (item->d_ptr->m_dirtyBits.positionDirty) { @@ -613,8 +625,6 @@ void Abstract3DRenderer::drawCustomItems(RenderingState state, if (m_customRenderCache.isEmpty()) return; - int itemIndex = 0; - if (RenderingNormal == state) { shader->bind(); shader->setUniformValue(shader->lightP(), m_cachedScene->activeLight()->position()); @@ -677,7 +687,7 @@ void Abstract3DRenderer::drawCustomItems(RenderingState state, } else if (RenderingSelection == state) { // Selection render shader->setUniformValue(shader->MVP(), MVPMatrix); - QVector4D itemColor = indexToSelectionColor(itemIndex++); + QVector4D itemColor = indexToSelectionColor(item->index()); itemColor.setW(customItemAlpha); itemColor /= 255.0f; shader->setUniformValue(shader->color(), itemColor); -- cgit v1.2.3 From 92ee7767f81f7a15b8773ed97356f01ecac68d0c Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Fri, 16 May 2014 15:26:14 +0300 Subject: Implement axis label autorotation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task-number: QTRD-2857 Change-Id: I158abb75272813cf7eb5d4b419e24325389d940e Reviewed-by: Tomi Korpipää --- src/datavisualization/engine/abstract3drenderer.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'src/datavisualization/engine/abstract3drenderer.cpp') diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp index 06954165..a2181271 100644 --- a/src/datavisualization/engine/abstract3drenderer.cpp +++ b/src/datavisualization/engine/abstract3drenderer.cpp @@ -366,6 +366,14 @@ void Abstract3DRenderer::updateAxisFormatter(QAbstract3DAxis::AxisOrientation or cache->setDataDirty(true); } +void Abstract3DRenderer::updateAxisLabelAutoRotation(QAbstract3DAxis::AxisOrientation orientation, + float angle) +{ + AxisRenderCache &cache = axisCacheForOrientation(orientation); + if (cache.labelAutoRotation() != angle) + cache.setLabelAutoRotation(angle); +} + void Abstract3DRenderer::modifiedSeriesList(const QVector &seriesList) { foreach (QAbstract3DSeries *series, seriesList) { -- cgit v1.2.3 From 806fd8ab43dd59da89d04651b22c5c0440032b94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Mon, 19 May 2014 10:16:11 +0300 Subject: Added property for disabling shadows on custom items Task-number: QTRD-3093 Change-Id: Ia24a1bc657af1bb1a528581e1f65fb50277e6874 Reviewed-by: Miikka Heikkinen --- src/datavisualization/engine/abstract3drenderer.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'src/datavisualization/engine/abstract3drenderer.cpp') diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp index a2181271..82952a26 100644 --- a/src/datavisualization/engine/abstract3drenderer.cpp +++ b/src/datavisualization/engine/abstract3drenderer.cpp @@ -582,6 +582,7 @@ CustomRenderItem *Abstract3DRenderer::addCustomItem(QCustom3DItem *item) QVector3D translation = convertPositionToTranslation(item->position()); newItem->setTranslation(translation); newItem->setVisible(item->isVisible()); + newItem->setShadowCasting(item->isShadowCasting()); m_customRenderCache.insert(item, newItem); return newItem; } @@ -620,6 +621,10 @@ void Abstract3DRenderer::updateCustomItem(CustomRenderItem *renderItem) renderItem->setVisible(item->isVisible()); item->d_ptr->m_dirtyBits.visibleDirty = false; } + if (item->d_ptr->m_dirtyBits.shadowCastingDirty) { + renderItem->setShadowCasting(item->isShadowCasting()); + item->d_ptr->m_dirtyBits.shadowCastingDirty = false; + } } void Abstract3DRenderer::drawCustomItems(RenderingState state, @@ -700,7 +705,7 @@ void Abstract3DRenderer::drawCustomItems(RenderingState state, itemColor /= 255.0f; shader->setUniformValue(shader->color(), itemColor); m_drawer->drawObject(shader, item->mesh()); - } else { + } else if (item->isShadowCasting()) { // Depth render shader->setUniformValue(shader->MVP(), depthProjectionViewMatrix * modelMatrix); m_drawer->drawObject(shader, item->mesh()); -- cgit v1.2.3 From b6da9160b2d81283ec9fc082c08987ecc95650da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Tue, 20 May 2014 08:54:07 +0300 Subject: Do not draw custom items outside axis ranges Task-number: QTRD-3057 Change-Id: Icb8904fa0a1c009985ac21ee6fa51eefda81d9cc Change-Id: Icb8904fa0a1c009985ac21ee6fa51eefda81d9cc Reviewed-by: Titta Heikkala Reviewed-by: Mika Salmela --- src/datavisualization/engine/abstract3drenderer.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) (limited to 'src/datavisualization/engine/abstract3drenderer.cpp') diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp index 82952a26..684db1a5 100644 --- a/src/datavisualization/engine/abstract3drenderer.cpp +++ b/src/datavisualization/engine/abstract3drenderer.cpp @@ -573,6 +573,7 @@ CustomRenderItem *Abstract3DRenderer::addCustomItem(QCustom3DItem *item) newItem->setItemPointer(item); // Store pointer for render item updates newItem->setMesh(item->meshFile()); newItem->setScaling(item->scaling()); + newItem->setPosition(item->position()); newItem->setRotation(item->rotation()); QImage textureImage = item->d_ptr->textureImage(); newItem->setBlendNeeded(textureImage.hasAlphaChannel()); @@ -614,6 +615,7 @@ void Abstract3DRenderer::updateCustomItem(CustomRenderItem *renderItem) } if (item->d_ptr->m_dirtyBits.positionDirty) { QVector3D translation = convertPositionToTranslation(item->position()); + renderItem->setPosition(item->position()); renderItem->setTranslation(translation); item->d_ptr->m_dirtyBits.positionDirty = false; } @@ -651,7 +653,14 @@ void Abstract3DRenderer::drawCustomItems(RenderingState state, // Draw custom items foreach (CustomRenderItem *item, m_customRenderCache) { - if (!item->isVisible()) + // Check that the render item is visible and within axis ranges, and skip drawing if not + if (!item->isVisible() + || item->position().x() < m_axisCacheX.min() + || item->position().x() > m_axisCacheX.max() + || item->position().z() < m_axisCacheZ.min() + || item->position().z() > m_axisCacheZ.max() + || item->position().y() < m_axisCacheY.min() + || item->position().y() > m_axisCacheY.max()) continue; QMatrix4x4 modelMatrix; -- cgit v1.2.3 From 1fe989d12f8fe5c13675158044bb76551fb5eb0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Tue, 20 May 2014 12:58:30 +0300 Subject: Added support for custom items with absolute coordinates Task-number: QTRD-3122 Change-Id: Iefd4c4adad45721ed3519bdcecbbfa1e97039f08 Reviewed-by: Mika Salmela --- .../engine/abstract3drenderer.cpp | 32 ++++++++++++++-------- 1 file changed, 21 insertions(+), 11 deletions(-) (limited to 'src/datavisualization/engine/abstract3drenderer.cpp') diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp index 684db1a5..988ea21e 100644 --- a/src/datavisualization/engine/abstract3drenderer.cpp +++ b/src/datavisualization/engine/abstract3drenderer.cpp @@ -574,13 +574,15 @@ CustomRenderItem *Abstract3DRenderer::addCustomItem(QCustom3DItem *item) newItem->setMesh(item->meshFile()); newItem->setScaling(item->scaling()); newItem->setPosition(item->position()); + newItem->setPositionAbsolute(item->isPositionAbsolute()); newItem->setRotation(item->rotation()); QImage textureImage = item->d_ptr->textureImage(); newItem->setBlendNeeded(textureImage.hasAlphaChannel()); GLuint texture = m_textureHelper->create2DTexture(textureImage, true, true, true); newItem->setTexture(texture); item->d_ptr->clearTextureImage(); - QVector3D translation = convertPositionToTranslation(item->position()); + QVector3D translation = convertPositionToTranslation(item->position(), + item->isPositionAbsolute()); newItem->setTranslation(translation); newItem->setVisible(item->isVisible()); newItem->setShadowCasting(item->isShadowCasting()); @@ -613,11 +615,14 @@ void Abstract3DRenderer::updateCustomItem(CustomRenderItem *renderItem) item->d_ptr->clearTextureImage(); item->d_ptr->m_dirtyBits.textureDirty = false; } - if (item->d_ptr->m_dirtyBits.positionDirty) { - QVector3D translation = convertPositionToTranslation(item->position()); + if (item->d_ptr->m_dirtyBits.positionDirty || item->d_ptr->m_dirtyBits.positionAbsoluteDirty) { renderItem->setPosition(item->position()); + renderItem->setPositionAbsolute(item->isPositionAbsolute()); + QVector3D translation = convertPositionToTranslation(item->position(), + item->isPositionAbsolute()); renderItem->setTranslation(translation); item->d_ptr->m_dirtyBits.positionDirty = false; + item->d_ptr->m_dirtyBits.positionAbsoluteDirty = false; } if (item->d_ptr->m_dirtyBits.visibleDirty) { renderItem->setVisible(item->isVisible()); @@ -653,16 +658,21 @@ void Abstract3DRenderer::drawCustomItems(RenderingState state, // Draw custom items foreach (CustomRenderItem *item, m_customRenderCache) { - // Check that the render item is visible and within axis ranges, and skip drawing if not - if (!item->isVisible() - || item->position().x() < m_axisCacheX.min() - || item->position().x() > m_axisCacheX.max() - || item->position().z() < m_axisCacheZ.min() - || item->position().z() > m_axisCacheZ.max() - || item->position().y() < m_axisCacheY.min() - || item->position().y() > m_axisCacheY.max()) + // Check that the render item is visible, and skip drawing if not + if (!item->isVisible()) continue; + // Check if the render item is in data coordinates and not within axis ranges, and skip drawing if it is + if (!item->isPositionAbsolute() + && (item->position().x() < m_axisCacheX.min() + || item->position().x() > m_axisCacheX.max() + || item->position().z() < m_axisCacheZ.min() + || item->position().z() > m_axisCacheZ.max() + || item->position().y() < m_axisCacheY.min() + || item->position().y() > m_axisCacheY.max())) { + continue; + } + QMatrix4x4 modelMatrix; QMatrix4x4 itModelMatrix; QMatrix4x4 MVPMatrix; -- cgit v1.2.3 From cb79f11be1c0c379a1eccea62606a58b73442f2f Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Wed, 21 May 2014 13:37:11 +0300 Subject: Cache ObjectHelper instances MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task-number: QTRD-2792 Change-Id: I90d83bd9b73a0f337fd26f1b92000e72b3ec0607 Reviewed-by: Tomi Korpipää --- src/datavisualization/engine/abstract3drenderer.cpp | 1 + 1 file changed, 1 insertion(+) (limited to 'src/datavisualization/engine/abstract3drenderer.cpp') diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp index 988ea21e..8c2e9578 100644 --- a/src/datavisualization/engine/abstract3drenderer.cpp +++ b/src/datavisualization/engine/abstract3drenderer.cpp @@ -570,6 +570,7 @@ QVector4D Abstract3DRenderer::indexToSelectionColor(GLint index) CustomRenderItem *Abstract3DRenderer::addCustomItem(QCustom3DItem *item) { CustomRenderItem *newItem = new CustomRenderItem(); + newItem->setRenderer(this); newItem->setItemPointer(item); // Store pointer for render item updates newItem->setMesh(item->meshFile()); newItem->setScaling(item->scaling()); -- cgit v1.2.3 From 0de21b382c039d6094a65d225d34185a821b583b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Thu, 22 May 2014 10:09:03 +0300 Subject: Update custom item translation when axes change, if needed Task-number: QTRD-3129 Change-Id: If7e28778ca7fd628159d37ee74ae2afb8d941e53 Change-Id: If7e28778ca7fd628159d37ee74ae2afb8d941e53 Reviewed-by: Miikka Heikkinen --- src/datavisualization/engine/abstract3drenderer.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) (limited to 'src/datavisualization/engine/abstract3drenderer.cpp') diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp index 8c2e9578..da839e2d 100644 --- a/src/datavisualization/engine/abstract3drenderer.cpp +++ b/src/datavisualization/engine/abstract3drenderer.cpp @@ -320,6 +320,8 @@ void Abstract3DRenderer::updateAxisRange(QAbstract3DAxis::AxisOrientation orient foreach (SeriesRenderCache *cache, m_renderCacheList) cache->setDataDirty(true); + + updateCustomItemPositions(); } void Abstract3DRenderer::updateAxisSegmentCount(QAbstract3DAxis::AxisOrientation orientation, @@ -348,6 +350,8 @@ void Abstract3DRenderer::updateAxisReversed(QAbstract3DAxis::AxisOrientation ori axisCacheForOrientation(orientation).setReversed(enable); foreach (SeriesRenderCache *cache, m_renderCacheList) cache->setDataDirty(true); + + updateCustomItemPositions(); } void Abstract3DRenderer::updateAxisFormatter(QAbstract3DAxis::AxisOrientation orientation, @@ -364,6 +368,8 @@ void Abstract3DRenderer::updateAxisFormatter(QAbstract3DAxis::AxisOrientation or foreach (SeriesRenderCache *cache, m_renderCacheList) cache->setDataDirty(true); + + updateCustomItemPositions(); } void Abstract3DRenderer::updateAxisLabelAutoRotation(QAbstract3DAxis::AxisOrientation orientation, @@ -635,6 +641,16 @@ void Abstract3DRenderer::updateCustomItem(CustomRenderItem *renderItem) } } +void Abstract3DRenderer::updateCustomItemPositions() +{ + foreach (CustomRenderItem *renderItem, m_customRenderCache) { + if (!renderItem->isPositionAbsolute()) { + QVector3D translation = convertPositionToTranslation(renderItem->position(), false); + renderItem->setTranslation(translation); + } + } +} + void Abstract3DRenderer::drawCustomItems(RenderingState state, ShaderHelper *shader, const QMatrix4x4 &viewMatrix, -- cgit v1.2.3 From 5611563234ac7edd47ad9df3a8bf0a293718d8f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Mon, 26 May 2014 09:57:25 +0300 Subject: Added API for changing data aspect ratio Task-number: QTRD-3144 Change-Id: I9acd1be13083d7fbbed840882260a60f46c5f698 Reviewed-by: Miikka Heikkinen --- .../engine/abstract3drenderer.cpp | 33 ++++++++++++++++------ 1 file changed, 25 insertions(+), 8 deletions(-) (limited to 'src/datavisualization/engine/abstract3drenderer.cpp') diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp index da839e2d..adba857b 100644 --- a/src/datavisualization/engine/abstract3drenderer.cpp +++ b/src/datavisualization/engine/abstract3drenderer.cpp @@ -52,7 +52,8 @@ Abstract3DRenderer::Abstract3DRenderer(Abstract3DController *controller) m_selectionLabelItem(0), m_visibleSeriesCount(0), m_customItemShader(0), - m_useOrthoProjection(false) + m_useOrthoProjection(false), + m_graphAspectRatio(2.0f) { QObject::connect(m_drawer, &Drawer::drawerChanged, this, &Abstract3DRenderer::updateTextures); @@ -271,18 +272,23 @@ void Abstract3DRenderer::updateSelectionMode(QAbstract3DGraph::SelectionFlags mo m_selectionDirty = true; } +void Abstract3DRenderer::updateAspectRatio(float ratio) +{ + m_graphAspectRatio = ratio; + calculateZoomLevel(); + m_cachedScene->activeCamera()->d_ptr->updateViewMatrix(m_autoScaleAdjustment); + foreach (SeriesRenderCache *cache, m_renderCacheList) + cache->setDataDirty(true); + updateCustomItemPositions(); +} + void Abstract3DRenderer::handleResize() { if (m_primarySubViewport.width() == 0 || m_primarySubViewport.height() == 0) return; - // Calculate zoom level based on aspect ratio - GLfloat div; - GLfloat zoomAdjustment; - div = qMin(m_primarySubViewport.width(), m_primarySubViewport.height()); - zoomAdjustment = defaultRatio * ((m_primarySubViewport.width() / div) - / (m_primarySubViewport.height() / div)); - m_autoScaleAdjustment = qMin(zoomAdjustment, 1.0f); // clamp to 1.0f + // Recalculate zoom + calculateZoomLevel(); // Re-init selection buffer initSelectionBuffer(); @@ -293,6 +299,17 @@ void Abstract3DRenderer::handleResize() #endif } +void Abstract3DRenderer::calculateZoomLevel() +{ + // Calculate zoom level based on aspect ratio + GLfloat div; + GLfloat zoomAdjustment; + div = qMin(m_primarySubViewport.width(), m_primarySubViewport.height()); + zoomAdjustment = 2.0f * defaultRatio * ((m_primarySubViewport.width() / div) + / (m_primarySubViewport.height() / div)) / m_graphAspectRatio; + m_autoScaleAdjustment = qMin(zoomAdjustment, 1.0f); // clamp to 1.0f +} + void Abstract3DRenderer::updateAxisType(QAbstract3DAxis::AxisOrientation orientation, QAbstract3DAxis::AxisType type) { -- cgit v1.2.3 From d9cb05d0f46efc58e508c233a3c67542a4c177fa Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Fri, 23 May 2014 16:06:28 +0300 Subject: Optionally show axis titles on the graph MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task-number: QTRD-2961 Change-Id: I6a344156bd29fa8fb1ede0546af4d0e67e5e2db4 Reviewed-by: Tomi Korpipää --- .../engine/abstract3drenderer.cpp | 252 ++++++++++++++++++++- 1 file changed, 250 insertions(+), 2 deletions(-) (limited to 'src/datavisualization/engine/abstract3drenderer.cpp') diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp index adba857b..cd03073d 100644 --- a/src/datavisualization/engine/abstract3drenderer.cpp +++ b/src/datavisualization/engine/abstract3drenderer.cpp @@ -53,8 +53,13 @@ Abstract3DRenderer::Abstract3DRenderer(Abstract3DController *controller) m_visibleSeriesCount(0), m_customItemShader(0), m_useOrthoProjection(false), - m_graphAspectRatio(2.0f) - + m_graphAspectRatio(2.0f), + m_xFlipped(false), + m_yFlipped(false), + m_zFlipped(false), + m_backgroundObj(0), + m_gridLineObj(0), + m_labelObj(0) { QObject::connect(m_drawer, &Drawer::drawerChanged, this, &Abstract3DRenderer::updateTextures); QObject::connect(this, &Abstract3DRenderer::needRender, controller, @@ -84,6 +89,10 @@ Abstract3DRenderer::~Abstract3DRenderer() } m_customRenderCache.clear(); + ObjectHelper::releaseObjectHelper(this, m_backgroundObj); + ObjectHelper::releaseObjectHelper(this, m_gridLineObj); + ObjectHelper::releaseObjectHelper(this, m_labelObj); + delete m_textureHelper; } @@ -397,6 +406,22 @@ void Abstract3DRenderer::updateAxisLabelAutoRotation(QAbstract3DAxis::AxisOrient cache.setLabelAutoRotation(angle); } +void Abstract3DRenderer::updateAxisTitleVisibility(QAbstract3DAxis::AxisOrientation orientation, + bool visible) +{ + AxisRenderCache &cache = axisCacheForOrientation(orientation); + if (cache.isTitleVisible() != visible) + cache.setTitleVisible(visible); +} + +void Abstract3DRenderer::updateAxisTitleFixed(QAbstract3DAxis::AxisOrientation orientation, + bool fixed) +{ + AxisRenderCache &cache = axisCacheForOrientation(orientation); + if (cache.isTitleFixed() != fixed) + cache.setTitleFixed(fixed); +} + void Abstract3DRenderer::modifiedSeriesList(const QVector &seriesList) { foreach (QAbstract3DSeries *series, seriesList) { @@ -545,6 +570,229 @@ void Abstract3DRenderer::lowerShadowQuality() updateShadowQuality(newQuality); } +void Abstract3DRenderer::drawAxisTitleY(const QVector3D &sideLabelRotation, + const QVector3D &backLabelRotation, + const QVector3D &sideLabelTrans, + const QVector3D &backLabelTrans, + const QQuaternion &totalSideRotation, + const QQuaternion &totalBackRotation, + AbstractRenderItem &dummyItem, + const Q3DCamera *activeCamera, + float labelsMaxWidth, + const QMatrix4x4 &viewMatrix, + const QMatrix4x4 &projectionMatrix, + ShaderHelper *shader) +{ + float scaleFactor = m_drawer->scaledFontSize() / m_axisCacheY.titleItem().size().height(); + float titleOffset = 2.0f * (labelMargin + (labelsMaxWidth * scaleFactor)); + float yRotation; + QVector3D titleTrans; + QQuaternion totalRotation; + if (m_xFlipped == m_zFlipped) { + yRotation = backLabelRotation.y(); + titleTrans = backLabelTrans; + totalRotation = totalBackRotation; + } else { + yRotation = sideLabelRotation.y(); + titleTrans = sideLabelTrans; + totalRotation = totalSideRotation; + } + + QQuaternion offsetRotator = QQuaternion::fromAxisAndAngle(0.0f, 1.0f, 0.0f, yRotation); + QVector3D titleOffsetVector = + offsetRotator.rotatedVector(QVector3D(-titleOffset, 0.0f, 0.0f)); + + QQuaternion titleRotation; + if (m_axisCacheY.isTitleFixed()) { + titleRotation = QQuaternion::fromAxisAndAngle(0.0f, 1.0f, 0.0f, yRotation) + * QQuaternion::fromAxisAndAngle(0.0f, 0.0f, 1.0f, 90.0f); + } else { + titleRotation = totalRotation + * QQuaternion::fromAxisAndAngle(0.0f, 0.0f, 1.0f, 90.0f); + } + dummyItem.setTranslation(titleTrans + titleOffsetVector); + + m_drawer->drawLabel(dummyItem, m_axisCacheY.titleItem(), viewMatrix, + projectionMatrix, zeroVector, titleRotation, 0, + m_cachedSelectionMode, shader, m_labelObj, activeCamera, + true, true, Drawer::LabelMid, Qt::AlignBottom); +} + +void Abstract3DRenderer::drawAxisTitleX(const QVector3D &labelRotation, + const QVector3D &labelTrans, + const QQuaternion &totalRotation, + AbstractRenderItem &dummyItem, + const Q3DCamera *activeCamera, + float labelsMaxWidth, + const QMatrix4x4 &viewMatrix, + const QMatrix4x4 &projectionMatrix, + ShaderHelper *shader) +{ + float scaleFactor = m_drawer->scaledFontSize() / m_axisCacheX.titleItem().size().height(); + float titleOffset = 2.0f * (labelMargin + (labelsMaxWidth * scaleFactor)); + float zRotation = 0.0f; + float yRotation = 0.0f; + float xRotation = -90.0f + labelRotation.z(); + float offsetRotation = labelRotation.z(); + float extraRotation = -90.0f; + Qt::AlignmentFlag alignment = Qt::AlignTop; + if (m_yFlipped) { + alignment = Qt::AlignBottom; + if (m_zFlipped) { + zRotation = 180.0f; + titleOffset = -titleOffset; + if (m_xFlipped) { + offsetRotation = -offsetRotation; + extraRotation = -extraRotation; + } else { + xRotation = -90.0f - labelRotation.z(); + } + } else { + zRotation = 180.0f; + yRotation = 180.0f; + if (m_xFlipped) { + offsetRotation = -offsetRotation; + xRotation = -90.0f - labelRotation.z(); + } else { + extraRotation = -extraRotation; + } + } + } else { + if (m_zFlipped) { + titleOffset = -titleOffset; + if (m_xFlipped) { + yRotation = 180.0f; + offsetRotation = -offsetRotation; + } else { + yRotation = 180.0f; + xRotation = -90.0f - labelRotation.z(); + extraRotation = -extraRotation; + } + } else { + if (m_xFlipped) { + offsetRotation = -offsetRotation; + xRotation = -90.0f - labelRotation.z(); + extraRotation = -extraRotation; + } + } + } + + if (offsetRotation == 180.0f || offsetRotation == -180.0f) + offsetRotation = 0.0f; + QQuaternion offsetRotator = QQuaternion::fromAxisAndAngle(1.0f, 0.0f, 0.0f, offsetRotation); + QVector3D titleOffsetVector = + offsetRotator.rotatedVector(QVector3D(0.0f, 0.0f, titleOffset)); + + QQuaternion titleRotation; + if (m_axisCacheX.isTitleFixed()) { + titleRotation = QQuaternion::fromAxisAndAngle(0.0f, 0.0f, 1.0f, zRotation) + * QQuaternion::fromAxisAndAngle(0.0f, 1.0f, 0.0f, yRotation) + * QQuaternion::fromAxisAndAngle(1.0f, 0.0f, 0.0f, xRotation); + } else { + titleRotation = totalRotation + * QQuaternion::fromAxisAndAngle(0.0f, 0.0f, 1.0f, extraRotation); + } + dummyItem.setTranslation(labelTrans + titleOffsetVector); + + m_drawer->drawLabel(dummyItem, m_axisCacheX.titleItem(), viewMatrix, + projectionMatrix, zeroVector, titleRotation, 0, + m_cachedSelectionMode, shader, m_labelObj, activeCamera, + true, true, Drawer::LabelMid, alignment); +} + +void Abstract3DRenderer::drawAxisTitleZ(const QVector3D &labelRotation, + const QVector3D &labelTrans, + const QQuaternion &totalRotation, + AbstractRenderItem &dummyItem, + const Q3DCamera *activeCamera, + float labelsMaxWidth, + const QMatrix4x4 &viewMatrix, + const QMatrix4x4 &projectionMatrix, + ShaderHelper *shader) +{ + float scaleFactor = m_drawer->scaledFontSize() / m_axisCacheZ.titleItem().size().height(); + float titleOffset = 2.0f * (labelMargin + (labelsMaxWidth * scaleFactor)); + float zRotation = labelRotation.z(); + float yRotation = -90.0f; + float xRotation = -90.0f; + float extraRotation = 90.0f; + Qt::AlignmentFlag alignment = Qt::AlignTop; + if (m_yFlipped) { + alignment = Qt::AlignBottom; + xRotation = -xRotation; + if (m_zFlipped) { + if (m_xFlipped) { + titleOffset = -titleOffset; + zRotation = -zRotation; + extraRotation = -extraRotation; + } else { + zRotation = -zRotation; + yRotation = -yRotation; + } + } else { + if (m_xFlipped) { + titleOffset = -titleOffset; + } else { + extraRotation = -extraRotation; + yRotation = -yRotation; + } + } + } else { + if (m_zFlipped) { + zRotation = -zRotation; + if (m_xFlipped) { + titleOffset = -titleOffset; + } else { + extraRotation = -extraRotation; + yRotation = -yRotation; + } + } else { + if (m_xFlipped) { + titleOffset = -titleOffset; + extraRotation = -extraRotation; + } else { + yRotation = -yRotation; + } + } + } + + float offsetRotation = zRotation; + if (offsetRotation == 180.0f || offsetRotation == -180.0f) + offsetRotation = 0.0f; + QQuaternion offsetRotator = QQuaternion::fromAxisAndAngle(0.0f, 0.0f, 1.0f, offsetRotation); + QVector3D titleOffsetVector = + offsetRotator.rotatedVector(QVector3D(titleOffset, 0.0f, 0.0f)); + + QQuaternion titleRotation; + if (m_axisCacheZ.isTitleFixed()) { + titleRotation = QQuaternion::fromAxisAndAngle(0.0f, 0.0f, 1.0f, zRotation) + * QQuaternion::fromAxisAndAngle(0.0f, 1.0f, 0.0f, yRotation) + * QQuaternion::fromAxisAndAngle(1.0f, 0.0f, 0.0f, xRotation); + } else { + titleRotation = totalRotation + * QQuaternion::fromAxisAndAngle(0.0f, 0.0f, 1.0f, extraRotation); + } + dummyItem.setTranslation(labelTrans + titleOffsetVector); + + m_drawer->drawLabel(dummyItem, m_axisCacheZ.titleItem(), viewMatrix, + projectionMatrix, zeroVector, titleRotation, 0, + m_cachedSelectionMode, shader, m_labelObj, activeCamera, + true, true, Drawer::LabelMid, alignment); +} + +void Abstract3DRenderer::loadGridLineMesh() +{ + ObjectHelper::resetObjectHelper(this, m_gridLineObj, + QStringLiteral(":/defaultMeshes/plane")); +} + +void Abstract3DRenderer::loadLabelMesh() +{ + ObjectHelper::resetObjectHelper(this, m_labelObj, + QStringLiteral(":/defaultMeshes/plane")); +} + + void Abstract3DRenderer::generateBaseColorTexture(const QColor &color, GLuint *texture) { m_textureHelper->deleteTexture(texture); -- cgit v1.2.3 From f1d7a4679711734b74538be649567d0826278920 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Wed, 28 May 2014 13:49:15 +0300 Subject: Added CustomLabelItem Task-number: QTRD-3135 Change-Id: Ie13c7ab5cbfca2eef88ed4ca17eaf46f2aeb4788 Reviewed-by: Miikka Heikkinen --- .../engine/abstract3drenderer.cpp | 100 ++++++++++++++++++--- 1 file changed, 88 insertions(+), 12 deletions(-) (limited to 'src/datavisualization/engine/abstract3drenderer.cpp') diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp index cd03073d..0f9109db 100644 --- a/src/datavisualization/engine/abstract3drenderer.cpp +++ b/src/datavisualization/engine/abstract3drenderer.cpp @@ -29,6 +29,7 @@ #include "qvalue3daxisformatter_p.h" #include "shaderhelper_p.h" #include "qcustom3ditem_p.h" +#include "qcustom3dlabel_p.h" QT_BEGIN_NAMESPACE_DATAVISUALIZATION @@ -315,7 +316,7 @@ void Abstract3DRenderer::calculateZoomLevel() GLfloat zoomAdjustment; div = qMin(m_primarySubViewport.width(), m_primarySubViewport.height()); zoomAdjustment = 2.0f * defaultRatio * ((m_primarySubViewport.width() / div) - / (m_primarySubViewport.height() / div)) / m_graphAspectRatio; + / (m_primarySubViewport.height() / div)) / m_graphAspectRatio; m_autoScaleAdjustment = qMin(zoomAdjustment, 1.0f); // clamp to 1.0f } @@ -844,11 +845,33 @@ CustomRenderItem *Abstract3DRenderer::addCustomItem(QCustom3DItem *item) newItem->setRenderer(this); newItem->setItemPointer(item); // Store pointer for render item updates newItem->setMesh(item->meshFile()); - newItem->setScaling(item->scaling()); + QVector3D scaling = item->scaling(); + QImage textureImage = item->d_ptr->textureImage(); + bool facingCamera = false; + if (item->d_ptr->m_isLabelItem) { + QCustom3DLabel *labelItem = static_cast(item); + float pointSize = labelItem->font().pointSizeF(); + // Check do we have custom visuals or need to use theme + if (!labelItem->dptr()->m_customVisuals) { + // Recreate texture using theme + labelItem->dptr()->createTextureImage(m_cachedTheme->labelBackgroundColor(), + m_cachedTheme->labelTextColor(), + m_cachedTheme->isLabelBackgroundEnabled(), + m_cachedTheme->isLabelBorderEnabled()); + pointSize = m_cachedTheme->font().pointSizeF(); + textureImage = item->d_ptr->textureImage(); + } + // Calculate scaling based on text (texture size), font size and asked scaling + float scaledFontSize = (0.05f + pointSize / 500.0f) / float(textureImage.height()); + scaling.setX(scaling.x() * textureImage.width() * scaledFontSize); + scaling.setY(scaling.y() * textureImage.height() * scaledFontSize); + // Check if facing camera + facingCamera = labelItem->isFacingCamera(); + } + newItem->setScaling(scaling); + newItem->setRotation(item->rotation()); newItem->setPosition(item->position()); newItem->setPositionAbsolute(item->isPositionAbsolute()); - newItem->setRotation(item->rotation()); - QImage textureImage = item->d_ptr->textureImage(); newItem->setBlendNeeded(textureImage.hasAlphaChannel()); GLuint texture = m_textureHelper->create2DTexture(textureImage, true, true, true); newItem->setTexture(texture); @@ -858,6 +881,7 @@ CustomRenderItem *Abstract3DRenderer::addCustomItem(QCustom3DItem *item) newItem->setTranslation(translation); newItem->setVisible(item->isVisible()); newItem->setShadowCasting(item->isShadowCasting()); + newItem->setFacingCamera(facingCamera); m_customRenderCache.insert(item, newItem); return newItem; } @@ -870,7 +894,31 @@ void Abstract3DRenderer::updateCustomItem(CustomRenderItem *renderItem) item->d_ptr->m_dirtyBits.meshDirty = false; } if (item->d_ptr->m_dirtyBits.scalingDirty) { - renderItem->setScaling(item->scaling()); + QVector3D scaling = item->scaling(); + // In case we have label item, we need to recreate texture for scaling adjustment + if (item->d_ptr->m_isLabelItem) { + QCustom3DLabel *labelItem = static_cast(item); + float pointSize = labelItem->font().pointSizeF(); + // Check do we have custom visuals or need to use theme + if (labelItem->dptr()->m_customVisuals) { + // Recreate texture + labelItem->dptr()->createTextureImage(); + } else { + // Recreate texture using theme + labelItem->dptr()->createTextureImage(m_cachedTheme->labelBackgroundColor(), + m_cachedTheme->labelTextColor(), + m_cachedTheme->isLabelBackgroundEnabled(), + m_cachedTheme->isLabelBorderEnabled()); + pointSize = m_cachedTheme->font().pointSizeF(); + } + QImage textureImage = item->d_ptr->textureImage(); + // Calculate scaling based on text (texture size), font size and asked scaling + float scaledFontSize = (0.05f + pointSize / 500.0f) / float(textureImage.height()); + scaling.setX(scaling.x() * textureImage.width() * scaledFontSize); + scaling.setY(scaling.y() * textureImage.height() * scaledFontSize); + item->d_ptr->clearTextureImage(); + } + renderItem->setScaling(scaling); item->d_ptr->m_dirtyBits.scalingDirty = false; } if (item->d_ptr->m_dirtyBits.rotationDirty) { @@ -879,6 +927,18 @@ void Abstract3DRenderer::updateCustomItem(CustomRenderItem *renderItem) } if (item->d_ptr->m_dirtyBits.textureDirty) { QImage textureImage = item->d_ptr->textureImage(); + if (item->d_ptr->m_isLabelItem) { + QCustom3DLabel *labelItem = static_cast(item); + // Check do we have custom visuals or need to use theme + if (!labelItem->dptr()->m_customVisuals) { + // Recreate texture using theme + labelItem->dptr()->createTextureImage(m_cachedTheme->labelBackgroundColor(), + m_cachedTheme->labelTextColor(), + m_cachedTheme->isLabelBackgroundEnabled(), + m_cachedTheme->isLabelBorderEnabled()); + textureImage = item->d_ptr->textureImage(); + } + } renderItem->setBlendNeeded(textureImage.hasAlphaChannel()); GLuint oldTexture = renderItem->texture(); m_textureHelper->deleteTexture(&oldTexture); @@ -904,15 +964,21 @@ void Abstract3DRenderer::updateCustomItem(CustomRenderItem *renderItem) renderItem->setShadowCasting(item->isShadowCasting()); item->d_ptr->m_dirtyBits.shadowCastingDirty = false; } + if (item->d_ptr->m_isLabelItem) { + QCustom3DLabel *labelItem = static_cast(item); + if (labelItem->dptr()->m_facingCameraDirty) { + renderItem->setFacingCamera(labelItem->isFacingCamera()); + labelItem->dptr()->m_facingCameraDirty = false; + } + } } void Abstract3DRenderer::updateCustomItemPositions() { foreach (CustomRenderItem *renderItem, m_customRenderCache) { - if (!renderItem->isPositionAbsolute()) { - QVector3D translation = convertPositionToTranslation(renderItem->position(), false); - renderItem->setTranslation(translation); - } + QVector3D translation = convertPositionToTranslation(renderItem->position(), + renderItem->isPositionAbsolute()); + renderItem->setTranslation(translation); } } @@ -959,11 +1025,21 @@ void Abstract3DRenderer::drawCustomItems(RenderingState state, QMatrix4x4 itModelMatrix; QMatrix4x4 MVPMatrix; + QQuaternion rotation = item->rotation(); + // Check if the (label) item should be facing camera, and adjust rotation accordingly + if (item->isFacingCamera()) { + float camRotationX = m_cachedScene->activeCamera()->xRotation(); + float camRotationY = m_cachedScene->activeCamera()->yRotation(); + rotation = QQuaternion::fromAxisAndAngle(0.0f, 1.0f, 0.0f, -camRotationX) + * QQuaternion::fromAxisAndAngle(1.0f, 0.0f, 0.0f, -camRotationY); + } + modelMatrix.translate(item->translation()); - modelMatrix.rotate(item->rotation()); + modelMatrix.rotate(rotation); modelMatrix.scale(item->scaling()); - itModelMatrix.rotate(item->rotation()); - itModelMatrix.scale(item->scaling()); + itModelMatrix.rotate(rotation); + if (!item->isFacingCamera()) + itModelMatrix.scale(item->scaling()); MVPMatrix = projectionViewMatrix * modelMatrix; if (RenderingNormal == state) { -- cgit v1.2.3 From 5170c3fb57210a89978501108e07c598fb083fbc Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Fri, 30 May 2014 14:37:43 +0300 Subject: Fix various issues MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I4a6d4775f3ca578370a9ce23491bddcb0f5486ec Reviewed-by: Tomi Korpipää --- src/datavisualization/engine/abstract3drenderer.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/datavisualization/engine/abstract3drenderer.cpp') diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp index 0f9109db..9a063e0c 100644 --- a/src/datavisualization/engine/abstract3drenderer.cpp +++ b/src/datavisualization/engine/abstract3drenderer.cpp @@ -54,13 +54,13 @@ Abstract3DRenderer::Abstract3DRenderer(Abstract3DController *controller) m_visibleSeriesCount(0), m_customItemShader(0), m_useOrthoProjection(false), - m_graphAspectRatio(2.0f), m_xFlipped(false), m_yFlipped(false), m_zFlipped(false), m_backgroundObj(0), m_gridLineObj(0), - m_labelObj(0) + m_labelObj(0), + m_graphAspectRatio(2.0f) { QObject::connect(m_drawer, &Drawer::drawerChanged, this, &Abstract3DRenderer::updateTextures); QObject::connect(this, &Abstract3DRenderer::needRender, controller, -- cgit v1.2.3 From c80c034c712d607f9c9b748cecda02e2af67820a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Tue, 3 Jun 2014 06:56:24 +0300 Subject: Clean up renderers Task-number: QTRD-3149 Change-Id: I71b9b7533ad3730d0d203c3d07e66d824b690fbb Reviewed-by: Titta Heikkala Reviewed-by: Miikka Heikkinen --- src/datavisualization/engine/abstract3drenderer.cpp | 6 ------ 1 file changed, 6 deletions(-) (limited to 'src/datavisualization/engine/abstract3drenderer.cpp') diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp index 9a063e0c..0d7aa3c3 100644 --- a/src/datavisualization/engine/abstract3drenderer.cpp +++ b/src/datavisualization/engine/abstract3drenderer.cpp @@ -17,15 +17,9 @@ ****************************************************************************/ #include "abstract3drenderer_p.h" -#include "qvalue3daxis.h" #include "texturehelper_p.h" -#include "utils_p.h" -#include "q3dscene_p.h" #include "q3dcamera_p.h" -#include "q3dlight_p.h" -#include "qabstract3dseries_p.h" #include "q3dtheme_p.h" -#include "objecthelper_p.h" #include "qvalue3daxisformatter_p.h" #include "shaderhelper_p.h" #include "qcustom3ditem_p.h" -- cgit v1.2.3 From 779da0484f409ac93d32e3fdd5af7a30a52883a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Wed, 4 Jun 2014 08:07:39 +0300 Subject: Clean up MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task-number: QTRD-3149 Change-Id: I37ae7bc7e88b7d8a2c81585333ab87e7fcb8fcc0 Change-Id: I37ae7bc7e88b7d8a2c81585333ab87e7fcb8fcc0 Reviewed-by: Tomi Korpipää --- src/datavisualization/engine/abstract3drenderer.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'src/datavisualization/engine/abstract3drenderer.cpp') diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp index 0d7aa3c3..18719483 100644 --- a/src/datavisualization/engine/abstract3drenderer.cpp +++ b/src/datavisualization/engine/abstract3drenderer.cpp @@ -309,8 +309,9 @@ void Abstract3DRenderer::calculateZoomLevel() GLfloat div; GLfloat zoomAdjustment; div = qMin(m_primarySubViewport.width(), m_primarySubViewport.height()); - zoomAdjustment = 2.0f * defaultRatio * ((m_primarySubViewport.width() / div) - / (m_primarySubViewport.height() / div)) / m_graphAspectRatio; + zoomAdjustment = 2.0f * defaultRatio + * ((m_primarySubViewport.width() / div) + / (m_primarySubViewport.height() / div)) / m_graphAspectRatio; m_autoScaleAdjustment = qMin(zoomAdjustment, 1.0f); // clamp to 1.0f } @@ -794,7 +795,8 @@ void Abstract3DRenderer::generateBaseColorTexture(const QColor &color, GLuint *t *texture = m_textureHelper->createUniformTexture(color); } -void Abstract3DRenderer::fixGradientAndGenerateTexture(QLinearGradient *gradient, GLuint *gradientTexture) +void Abstract3DRenderer::fixGradientAndGenerateTexture(QLinearGradient *gradient, + GLuint *gradientTexture) { // Readjust start/stop to match gradient texture size gradient->setStart(qreal(gradientTextureWidth), qreal(gradientTextureHeight)); -- cgit v1.2.3 From 2299481acb0b36d76414ed9e0ae2b2d110ff13d8 Mon Sep 17 00:00:00 2001 From: Mika Salmela Date: Thu, 5 Jun 2014 10:32:24 +0300 Subject: Scatter perf improvement MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task-number: QTRD-3148 Change-Id: I2c9efa84184819aaac123ee29685bc3a9e35bfe6 Reviewed-by: Tomi Korpipää Reviewed-by: Miikka Heikkinen --- src/datavisualization/engine/abstract3drenderer.cpp | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'src/datavisualization/engine/abstract3drenderer.cpp') diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp index 18719483..5d97a6ca 100644 --- a/src/datavisualization/engine/abstract3drenderer.cpp +++ b/src/datavisualization/engine/abstract3drenderer.cpp @@ -35,6 +35,7 @@ Abstract3DRenderer::Abstract3DRenderer(Abstract3DController *controller) m_cachedShadowQuality(QAbstract3DGraph::ShadowQualityMedium), m_autoScaleAdjustment(1.0f), m_cachedSelectionMode(QAbstract3DGraph::SelectionNone), + m_cachedOptimizationHint(QAbstract3DGraph::OptimizationDefault), m_textureHelper(0), m_cachedScene(new Q3DScene()), m_selectionDirty(true), @@ -286,6 +287,11 @@ void Abstract3DRenderer::updateAspectRatio(float ratio) updateCustomItemPositions(); } +void Abstract3DRenderer::updateOptimizationHint(QAbstract3DGraph::OptimizationHints hint) +{ + m_cachedOptimizationHint = hint; +} + void Abstract3DRenderer::handleResize() { if (m_primarySubViewport.width() == 0 || m_primarySubViewport.height() == 0) -- cgit v1.2.3