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/data/customrenderitem_p.h | 3 +++ src/datavisualization/data/qcustom3ditem.cpp | 5 +++-- src/datavisualization/engine/abstract3drenderer.cpp | 19 ++++++++++++++----- src/datavisualization/engine/bars3drenderer.cpp | 9 +++++---- src/datavisualization/engine/scatter3drenderer.cpp | 8 ++++---- src/datavisualization/engine/surface3drenderer.cpp | 8 ++++---- 6 files changed, 33 insertions(+), 19 deletions(-) (limited to 'src/datavisualization') diff --git a/src/datavisualization/data/customrenderitem_p.h b/src/datavisualization/data/customrenderitem_p.h index 9b6dd167..0632f53e 100644 --- a/src/datavisualization/data/customrenderitem_p.h +++ b/src/datavisualization/data/customrenderitem_p.h @@ -47,11 +47,14 @@ public: inline ObjectHelper *mesh() { return m_object; } inline void setScaling(const QVector3D &scaling) { m_scaling = scaling; } inline QVector3D scaling() { return m_scaling; } + inline void setBlendNeeded(bool blend) { m_needBlend = blend; } + inline bool isBlendNeeded() { return m_needBlend; } private: GLuint m_texture; QVector3D m_scaling; ObjectHelper *m_object; + bool m_needBlend; }; typedef QVector CustomRenderItemArray; diff --git a/src/datavisualization/data/qcustom3ditem.cpp b/src/datavisualization/data/qcustom3ditem.cpp index 69da30bf..70795fdf 100644 --- a/src/datavisualization/data/qcustom3ditem.cpp +++ b/src/datavisualization/data/qcustom3ditem.cpp @@ -92,6 +92,7 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION QCustom3DItem::QCustom3DItem(QObject *parent) : d_ptr(new QCustom3DItemPrivate(this, parent)) { + setTextureImage(QImage()); } /*! @@ -203,7 +204,7 @@ void QCustom3DItem::setTextureImage(const QImage &textureImage) { if (textureImage.isNull()) { // Make a solid gray texture - d_ptr->m_textureImage = QImage(2, 2, QImage::Format_ARGB32); + d_ptr->m_textureImage = QImage(2, 2, QImage::Format_RGB32); d_ptr->m_textureImage.fill(Qt::gray); } else { d_ptr->m_textureImage = textureImage; @@ -227,7 +228,7 @@ void QCustom3DItem::setTextureFile(const QString &textureFile) if (!textureFile.isEmpty()) { d_ptr->m_textureImage = QImage(textureFile); } else { - d_ptr->m_textureImage = QImage(2, 2, QImage::Format_ARGB32); + d_ptr->m_textureImage = QImage(2, 2, QImage::Format_RGB32); d_ptr->m_textureImage.fill(Qt::gray); } emit textureFileChanged(textureFile); 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); } } diff --git a/src/datavisualization/engine/bars3drenderer.cpp b/src/datavisualization/engine/bars3drenderer.cpp index 015f76d5..661c3f3e 100644 --- a/src/datavisualization/engine/bars3drenderer.cpp +++ b/src/datavisualization/engine/bars3drenderer.cpp @@ -1474,10 +1474,6 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) // Reset culling glCullFace(GL_BACK); - Abstract3DRenderer::drawCustomItems(RenderingNormal, m_customItemShader, viewMatrix, - projectionViewMatrix, depthProjectionViewMatrix, - m_depthTexture, m_shadowQualityToShader); - // Bind background shader m_backgroundShader->bind(); @@ -1800,6 +1796,11 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) } } } + + Abstract3DRenderer::drawCustomItems(RenderingNormal, m_customItemShader, viewMatrix, + projectionViewMatrix, depthProjectionViewMatrix, + m_depthTexture, m_shadowQualityToShader); + drawLabels(false, activeCamera, viewMatrix, projectionMatrix, rowScaleFactor, columnScaleFactor); diff --git a/src/datavisualization/engine/scatter3drenderer.cpp b/src/datavisualization/engine/scatter3drenderer.cpp index 9e8712e3..b71cd22b 100644 --- a/src/datavisualization/engine/scatter3drenderer.cpp +++ b/src/datavisualization/engine/scatter3drenderer.cpp @@ -806,10 +806,6 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) } #endif - Abstract3DRenderer::drawCustomItems(RenderingNormal, m_customItemShader, viewMatrix, - projectionViewMatrix, depthProjectionViewMatrix, - m_depthTexture, m_shadowQualityToShader); - // Bind background shader m_backgroundShader->bind(); @@ -1280,6 +1276,10 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) } } + Abstract3DRenderer::drawCustomItems(RenderingNormal, m_customItemShader, viewMatrix, + projectionViewMatrix, depthProjectionViewMatrix, + m_depthTexture, m_shadowQualityToShader); + drawLabels(false, activeCamera, viewMatrix, projectionMatrix); // Handle selection clearing and selection label drawing diff --git a/src/datavisualization/engine/surface3drenderer.cpp b/src/datavisualization/engine/surface3drenderer.cpp index f405212f..a75cf699 100644 --- a/src/datavisualization/engine/surface3drenderer.cpp +++ b/src/datavisualization/engine/surface3drenderer.cpp @@ -1361,10 +1361,6 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) } } - Abstract3DRenderer::drawCustomItems(RenderingNormal, m_customItemShader, viewMatrix, - projectionViewMatrix, depthProjectionViewMatrix, - m_depthTexture, m_shadowQualityToShader); - // Bind background shader m_backgroundShader->bind(); glCullFace(GL_BACK); @@ -1770,6 +1766,10 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) } } + Abstract3DRenderer::drawCustomItems(RenderingNormal, m_customItemShader, viewMatrix, + projectionViewMatrix, depthProjectionViewMatrix, + m_depthTexture, m_shadowQualityToShader); + drawLabels(false, activeCamera, viewMatrix, projectionMatrix); // Release shader -- cgit v1.2.3