summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorTomi Korpipää <tomi.korpipaa@digia.com>2014-05-14 07:33:23 +0300
committerTomi Korpipää <tomi.korpipaa@digia.com>2014-05-14 08:30:24 +0300
commitc5e993ad507cc0d56d0e2a62076584d020086ad7 (patch)
tree7c13a0fa99d43d6c6fcb196beb4c664d5db98334 /src
parenta309eb6a29fcdd57f37aef424c30bc13f3fde9b7 (diff)
Use blending for custom items only when needed
Task-number: QTRD-3077 Change-Id: I2406a8fd133943379a5cb1c1c2961a419ef9315f Reviewed-by: Titta Heikkala <titta.heikkala@digia.com> Reviewed-by: Miikka Heikkinen <miikka.heikkinen@digia.com>
Diffstat (limited to 'src')
-rw-r--r--src/datavisualization/data/customrenderitem_p.h3
-rw-r--r--src/datavisualization/data/qcustom3ditem.cpp5
-rw-r--r--src/datavisualization/engine/abstract3drenderer.cpp19
-rw-r--r--src/datavisualization/engine/bars3drenderer.cpp9
-rw-r--r--src/datavisualization/engine/scatter3drenderer.cpp8
-rw-r--r--src/datavisualization/engine/surface3drenderer.cpp8
6 files changed, 33 insertions, 19 deletions
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<CustomRenderItem *> 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