summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTomi Korpipää <tomi.korpipaa@digia.com>2013-09-23 13:12:50 +0300
committerTomi Korpipää <tomi.korpipaa@digia.com>2013-09-23 13:28:57 +0300
commit5261fd6733ab7080989112e08057632dd76f22b3 (patch)
tree242153eac6a4ff415e103051c043f5a0aa258849
parent9f8f25a8b526d636fccf70c9f782b714da865983 (diff)
Label "skewing" fixed
Task-number: QTRD-2322 Change-Id: Ie4bb95dc4f62bad1fef605461452168ea260fa26 Reviewed-by: Miikka Heikkinen <miikka.heikkinen@digia.com> Reviewed-by: Mika Salmela <mika.salmela@digia.com>
-rw-r--r--src/datavisualization/engine/axisrendercache.cpp2
-rw-r--r--src/datavisualization/engine/bars3drenderer.cpp20
-rw-r--r--src/datavisualization/engine/drawer.cpp3
-rw-r--r--src/datavisualization/engine/scatter3drenderer.cpp14
-rw-r--r--src/datavisualization/engine/surface3drenderer.cpp11
-rw-r--r--src/datavisualization/global/datavisualizationglobal_p.h4
-rw-r--r--src/datavisualization/utils/utils.cpp31
-rw-r--r--tests/barstest/chart.cpp2
8 files changed, 43 insertions, 44 deletions
diff --git a/src/datavisualization/engine/axisrendercache.cpp b/src/datavisualization/engine/axisrendercache.cpp
index c525c777..55ac0765 100644
--- a/src/datavisualization/engine/axisrendercache.cpp
+++ b/src/datavisualization/engine/axisrendercache.cpp
@@ -173,7 +173,7 @@ int AxisRenderCache::maxLabelWidth(const QStringList &labels) const
{
int labelWidth = 0;
QFont labelFont = m_font;
- labelFont.setPointSize(50);
+ labelFont.setPointSize(textureFontSize);
QFontMetrics labelFM(labelFont);
for (int i = 0; i < labels.size(); i++) {
int newWidth = labelFM.width(labels.at(i));
diff --git a/src/datavisualization/engine/bars3drenderer.cpp b/src/datavisualization/engine/bars3drenderer.cpp
index bf57f21f..b2f3bd41 100644
--- a/src/datavisualization/engine/bars3drenderer.cpp
+++ b/src/datavisualization/engine/bars3drenderer.cpp
@@ -216,7 +216,7 @@ void Bars3DRenderer::updateScene(Q3DScene *scene)
scene->setUnderSideCameraEnabled(m_hasNegativeValues);
if (m_hasHeightAdjustmentChanged) {
// Set initial camera position. Also update if height adjustment has changed.
- scene->activeCamera()->setBaseOrientation(QVector3D(0.0f, 0.0f, 6.0f + zComp),
+ scene->activeCamera()->setBaseOrientation(QVector3D(0.0f, 0.0f, cameraDistance + zComp),
QVector3D(0.0f, -m_yAdjustment, zComp),
QVector3D(0.0f, 1.0f, 0.0f));
m_hasHeightAdjustmentChanged = false;
@@ -363,10 +363,8 @@ void Bars3DRenderer::drawSlicedScene(const LabelItem &xLabel,
glDisable(GL_DEPTH_TEST);
glEnable(GL_TEXTURE_2D);
glCullFace(GL_BACK);
- if (m_cachedLabelTransparency > QDataVis::TransparencyNone) {
- glEnable(GL_BLEND);
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- }
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
// Draw labels for axes
BarRenderItem *dummyItem(0);
@@ -439,8 +437,7 @@ void Bars3DRenderer::drawSlicedScene(const LabelItem &xLabel,
}
glDisable(GL_TEXTURE_2D);
- if (m_cachedLabelTransparency > QDataVis::TransparencyNone)
- glDisable(GL_BLEND);
+ glDisable(GL_BLEND);
glEnable(GL_DEPTH_TEST);
// Release label shader
@@ -1233,10 +1230,8 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle)
m_labelShader->bind();
glEnable(GL_TEXTURE_2D);
- if (m_cachedLabelTransparency > QDataVis::TransparencyNone) {
- glEnable(GL_BLEND);
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- }
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
// Calculate the positions for row and column labels and store them
for (int row = 0; row != m_cachedRowCount; row++) {
@@ -1472,8 +1467,7 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle)
}
glDisable(GL_TEXTURE_2D);
- if (m_cachedLabelTransparency > QDataVis::TransparencyNone)
- glDisable(GL_BLEND);
+ glDisable(GL_BLEND);
// Release label shader
m_labelShader->release();
diff --git a/src/datavisualization/engine/drawer.cpp b/src/datavisualization/engine/drawer.cpp
index 7fcf581f..307dd63e 100644
--- a/src/datavisualization/engine/drawer.cpp
+++ b/src/datavisualization/engine/drawer.cpp
@@ -309,10 +309,11 @@ void Drawer::drawLabel(const AbstractRenderItem &item, const LabelItem &labelIte
modelMatrix.rotate(rotation.x(), 1.0f, 0.0f, 0.0f);
if (useDepth && !rotateAlong) {
+ qreal yComp = qreal(qRadiansToDegrees(qTan(positionComp.y() / cameraDistance)));
// Apply negative camera rotations to keep labels facing camera
QPointF camRotations = camera->rotations();
modelMatrix.rotate(-camRotations.x(), 0.0f, 1.0f, 0.0f);
- modelMatrix.rotate(-camRotations.y(), 1.0f, 0.0f, 0.0f);
+ modelMatrix.rotate(-camRotations.y() - yComp, 1.0f, 0.0f, 0.0f);
}
// Scale label based on text size
diff --git a/src/datavisualization/engine/scatter3drenderer.cpp b/src/datavisualization/engine/scatter3drenderer.cpp
index 38044bbe..5c643bb2 100644
--- a/src/datavisualization/engine/scatter3drenderer.cpp
+++ b/src/datavisualization/engine/scatter3drenderer.cpp
@@ -170,7 +170,7 @@ void Scatter3DRenderer::updateScene(Q3DScene *scene)
if (m_hasHeightAdjustmentChanged) {
// Set initial m_cachedScene->activeCamera() position. Also update if height adjustment has changed.
- scene->activeCamera()->setBaseOrientation(QVector3D(0.0f, 0.0f, 6.0f + zComp),
+ scene->activeCamera()->setBaseOrientation(QVector3D(0.0f, 0.0f, cameraDistance + zComp),
QVector3D(0.0f, 0.0f, zComp),
QVector3D(0.0f, 1.0f, 0.0f));
m_hasHeightAdjustmentChanged = false;
@@ -1071,10 +1071,8 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle)
m_labelShader->bind();
glEnable(GL_TEXTURE_2D);
- if (m_cachedLabelTransparency > QDataVis::TransparencyNone) {
- glEnable(GL_BLEND);
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- }
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
// Z Labels
if (m_axisCacheZ.segmentCount() > 0) {
@@ -1333,7 +1331,8 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle)
QVector3D(0.0f, 0.0f, zComp),
QVector3D(0.0f, 0.0f, 0.0f), 0,
m_cachedSelectionMode, m_labelShader,
- m_labelObj, m_cachedScene->activeCamera(), true, false, Drawer::LabelMid);
+ m_labelObj, m_cachedScene->activeCamera(), true, false,
+ Drawer::LabelMid);
// Reset label update flag; they should have been updated when we get here
m_updateLabels = false;
@@ -1341,8 +1340,7 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle)
}
glDisable(GL_TEXTURE_2D);
- if (m_cachedLabelTransparency > QDataVis::TransparencyNone)
- glDisable(GL_BLEND);
+ glDisable(GL_BLEND);
// Release label shader
m_labelShader->release();
diff --git a/src/datavisualization/engine/surface3drenderer.cpp b/src/datavisualization/engine/surface3drenderer.cpp
index 656d469a..9fea6ddb 100644
--- a/src/datavisualization/engine/surface3drenderer.cpp
+++ b/src/datavisualization/engine/surface3drenderer.cpp
@@ -281,7 +281,7 @@ void Surface3DRenderer::updateScene(Q3DScene *scene)
// Set initial camera position
// X must be 0 for rotation to work - we can use "setCameraRotation" for setting it later
if (m_hasHeightAdjustmentChanged) {
- scene->activeCamera()->setBaseOrientation(QVector3D(0.0f, 0.0f, 6.0f + zComp),
+ scene->activeCamera()->setBaseOrientation(QVector3D(0.0f, 0.0f, cameraDistance + zComp),
QVector3D(0.0f, 0.0f, zComp),
QVector3D(0.0f, 1.0f, 0.0f));
// For now this is used just to make things once. Proper use will come
@@ -1006,10 +1006,8 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle)
// Draw axis labels
m_labelShader->bind();
- if (m_cachedLabelTransparency > QDataVis::TransparencyNone) {
- glEnable(GL_BLEND);
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- }
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
// Z Labels
QVector3D positionZComp(0.0f, 0.0f, zComp);
@@ -1179,8 +1177,7 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle)
glDisable(GL_TEXTURE_2D);
- if (m_cachedLabelTransparency > QDataVis::TransparencyNone)
- glDisable(GL_BLEND);
+ glDisable(GL_BLEND);
// Release label shader
m_labelShader->release();
diff --git a/src/datavisualization/global/datavisualizationglobal_p.h b/src/datavisualization/global/datavisualizationglobal_p.h
index 29fcc532..4da1023c 100644
--- a/src/datavisualization/global/datavisualizationglobal_p.h
+++ b/src/datavisualization/global/datavisualizationglobal_p.h
@@ -40,6 +40,10 @@ QT_DATAVISUALIZATION_BEGIN_NAMESPACE
// Constants used in several files
// Compensation for z position; move all objects to positive z, as shader can't handle negative values correctly
const GLfloat zComp = 10.0f;
+// Distance from camera to origin
+const GLfloat cameraDistance = 6.0f;
+// Size of font to be used in label texture rendering. Doesn't affect the actual font size.
+const int textureFontSize = 50;
// Default light position. To have shadows working correctly, light should be as far as camera, or a bit further
// y position is added to the minimum height (or can be thought to be that much above or below the camera)
const QVector3D defaultLightPos = QVector3D(0.0f, 0.5f, zComp);
diff --git a/src/datavisualization/utils/utils.cpp b/src/datavisualization/utils/utils.cpp
index eaefad97..4cda5fad 100644
--- a/src/datavisualization/utils/utils.cpp
+++ b/src/datavisualization/utils/utils.cpp
@@ -52,7 +52,7 @@ QImage Utils::printTextToImage(const QFont &font, const QString &text, const QCo
GLuint paddingHeight = 15;
// Calculate text dimensions
QFont valueFont = font;
- valueFont.setPointSize(50);
+ valueFont.setPointSize(textureFontSize);
QFontMetrics valueFM(valueFont);
int valueStrWidth = valueFM.width(text);
if (maxLabelWidth && QDataVis::TransparencyNoBackground != transparency)
@@ -88,9 +88,9 @@ QImage Utils::printTextToImage(const QFont &font, const QString &text, const QCo
// Paint text
painter.setRenderHint(QPainter::Antialiasing, true);
painter.setCompositionMode(QPainter::CompositionMode_Source);
+ painter.setFont(valueFont);
switch (transparency) {
case QDataVis::TransparencyNoBackground: {
- painter.setFont(valueFont);
painter.setPen(txtColor);
#if defined(Q_OS_ANDROID)
painter.drawText((labelSize.width() - valueStrWidth) / 2.0f,
@@ -108,12 +108,14 @@ QImage Utils::printTextToImage(const QFont &font, const QString &text, const QCo
}
case QDataVis::TransparencyFromTheme: {
painter.setBrush(QBrush(bgrColor));
- if (borders)
+ if (borders) {
painter.setPen(QPen(QBrush(txtColor), 5, Qt::SolidLine, Qt::SquareCap, Qt::RoundJoin));
- else
+ painter.drawRoundedRect(5, 5, labelSize.width() - 10, labelSize.height() - 10,
+ 10.0, 10.0);
+ } else {
painter.setPen(bgrColor);
- painter.drawRoundedRect(0, 0, labelSize.width(), labelSize.height(), 10.0, 10.0f);
- painter.setFont(valueFont);
+ painter.drawRoundedRect(0, 0, labelSize.width(), labelSize.height(), 10.0, 10.0);
+ }
painter.setPen(txtColor);
painter.drawText((labelSize.width() - valueStrWidth) / 2.0f,
(labelSize.height() - valueStrHeight) / 2.0f,
@@ -123,13 +125,16 @@ QImage Utils::printTextToImage(const QFont &font, const QString &text, const QCo
break;
}
case QDataVis::TransparencyNone: {
- painter.setBrush(QBrush(bgrColor));
- if (borders)
- painter.setPen(QPen(QBrush(txtColor), 7.5));
- else
- painter.setPen(bgrColor);
- painter.drawRect(0, 0, labelSize.width(), labelSize.height());
- painter.setFont(valueFont);
+ QColor labelColor = QColor(bgrColor);
+ labelColor.setAlphaF(1.0);
+ painter.setBrush(QBrush(labelColor));
+ if (borders) {
+ painter.setPen(QPen(QBrush(txtColor), 7.5, Qt::SolidLine, Qt::SquareCap, Qt::MiterJoin));
+ painter.drawRect(7.5, 7.5, labelSize.width() - 15, labelSize.height() - 15);
+ } else {
+ painter.setPen(labelColor);
+ painter.drawRect(0, 0, labelSize.width(), labelSize.height());
+ }
painter.setPen(txtColor);
painter.drawText((labelSize.width() - valueStrWidth) / 2.0f,
(labelSize.height() - valueStrHeight) / 2.0f,
diff --git a/tests/barstest/chart.cpp b/tests/barstest/chart.cpp
index cfc072de..578ac258 100644
--- a/tests/barstest/chart.cpp
+++ b/tests/barstest/chart.cpp
@@ -468,7 +468,7 @@ void ChartModifier::changeTransparency()
m_chart->setLabelTransparency((QDataVis::LabelTransparency)transparency);
if (++transparency > QDataVis::TransparencyNoBackground)
- transparency = QDataVis::TransparencyFromTheme;
+ transparency = QDataVis::TransparencyNone;
}
void ChartModifier::changeSelectionMode()