summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiikka Heikkinen <miikka.heikkinen@digia.com>2014-09-19 11:05:27 +0300
committerMiikka Heikkinen <miikka.heikkinen@digia.com>2014-09-19 11:12:11 +0300
commit105e85170d35f7086dc96d1853298fcf8d680e06 (patch)
tree295d8fd37832014ce1e65ab12d57f6aae757740b
parent98e0c04fe78da9735c2943524bd36648b2654f98 (diff)
Change custom labels to use label shader
This fixes the problem with specular highlight making camera-facing labels unreadable. Task-number: QTRD-3276 Change-Id: If16424b07a1f3362428980353c5fb5213c33d06b Reviewed-by: Tomi Korpipää <tomi.korpipaa@digia.com>
-rw-r--r--examples/datavisualization/volumetric/volumetric.cpp138
-rw-r--r--src/datavisualization/engine/abstract3drenderer.cpp22
-rw-r--r--src/datavisualization/engine/abstract3drenderer_p.h3
-rw-r--r--src/datavisualization/engine/bars3drenderer.cpp12
-rw-r--r--src/datavisualization/engine/bars3drenderer_p.h2
-rw-r--r--src/datavisualization/engine/scatter3drenderer.cpp13
-rw-r--r--src/datavisualization/engine/scatter3drenderer_p.h2
-rw-r--r--src/datavisualization/engine/surface3drenderer.cpp12
-rw-r--r--src/datavisualization/engine/surface3drenderer_p.h2
9 files changed, 95 insertions, 111 deletions
diff --git a/examples/datavisualization/volumetric/volumetric.cpp b/examples/datavisualization/volumetric/volumetric.cpp
index 6672d964..cbbaf2a1 100644
--- a/examples/datavisualization/volumetric/volumetric.cpp
+++ b/examples/datavisualization/volumetric/volumetric.cpp
@@ -198,7 +198,6 @@ VolumetricModifier::VolumetricModifier(Q3DScatter *scatter)
warningLabel->setPositionAbsolute(true);
warningLabel->setFacingCamera(true);
m_graph->addCustomItem(warningLabel);
- m_graph->activeTheme()->setLightStrength(1.0f);
#endif
QObject::connect(m_graph->scene()->activeCamera(), &Q3DCamera::zoomLevelChanged, this,
@@ -266,10 +265,10 @@ void VolumetricModifier::sliceZ(int enabled)
void VolumetricModifier::adjustSliceX(int value)
{
- m_sliceIndexX = value / (1024 / m_volumeItem->textureWidth());
- if (m_sliceIndexX == m_volumeItem->textureWidth())
- m_sliceIndexX--;
if (m_volumeItem) {
+ m_sliceIndexX = value / (1024 / m_volumeItem->textureWidth());
+ if (m_sliceIndexX == m_volumeItem->textureWidth())
+ m_sliceIndexX--;
if (m_volumeItem->sliceIndexX() != -1)
//! [7]
m_volumeItem->setSliceIndexX(m_sliceIndexX);
@@ -283,10 +282,10 @@ void VolumetricModifier::adjustSliceX(int value)
void VolumetricModifier::adjustSliceY(int value)
{
- m_sliceIndexY = value / (1024 / m_volumeItem->textureHeight());
- if (m_sliceIndexY == m_volumeItem->textureHeight())
- m_sliceIndexY--;
if (m_volumeItem) {
+ m_sliceIndexY = value / (1024 / m_volumeItem->textureHeight());
+ if (m_sliceIndexY == m_volumeItem->textureHeight())
+ m_sliceIndexY--;
if (m_volumeItem->sliceIndexY() != -1)
m_volumeItem->setSliceIndexY(m_sliceIndexY);
m_sliceLabelY->setPixmap(
@@ -296,10 +295,10 @@ void VolumetricModifier::adjustSliceY(int value)
void VolumetricModifier::adjustSliceZ(int value)
{
- m_sliceIndexZ = value / (1024 / m_volumeItem->textureDepth());
- if (m_sliceIndexZ == m_volumeItem->textureDepth())
- m_sliceIndexZ--;
- if (m_volumeItem) {
+ if (m_volumeItem) {
+ m_sliceIndexZ = value / (1024 / m_volumeItem->textureDepth());
+ if (m_sliceIndexZ == m_volumeItem->textureDepth())
+ m_sliceIndexZ--;
if (m_volumeItem->sliceIndexZ() != -1)
m_volumeItem->setSliceIndexZ(m_sliceIndexZ);
m_sliceLabelZ->setPixmap(
@@ -353,7 +352,7 @@ void VolumetricModifier::handleTimeout()
void VolumetricModifier::toggleLowDetail(bool enabled)
{
- if (enabled) {
+ if (enabled && m_volumeItem) {
m_volumeItem->setTextureData(new QVector<uchar>(*m_lowDetailData));
m_volumeItem->setTextureDimensions(lowDetailSize, lowDetailSize / 2, lowDetailSize);
adjustSliceX(m_sliceSliderX->value());
@@ -364,7 +363,7 @@ void VolumetricModifier::toggleLowDetail(bool enabled)
void VolumetricModifier::toggleMediumDetail(bool enabled)
{
- if (enabled) {
+ if (enabled && m_volumeItem) {
m_volumeItem->setTextureData(new QVector<uchar>(*m_mediumDetailData));
m_volumeItem->setTextureDimensions(mediumDetailSize, mediumDetailSize / 2, mediumDetailSize);
adjustSliceX(m_sliceSliderX->value());
@@ -375,7 +374,7 @@ void VolumetricModifier::toggleMediumDetail(bool enabled)
void VolumetricModifier::toggleHighDetail(bool enabled)
{
- if (enabled) {
+ if (enabled && m_volumeItem) {
m_volumeItem->setTextureData(new QVector<uchar>(*m_highDetailData));
m_volumeItem->setTextureDimensions(highDetailSize, highDetailSize / 2, highDetailSize);
adjustSliceX(m_sliceSliderX->value());
@@ -407,76 +406,87 @@ void VolumetricModifier::setSliceSliders(QSlider *sliderX, QSlider *sliderY, QSl
void VolumetricModifier::changeColorTable(int enabled)
{
- if (enabled)
- m_volumeItem->setColorTable(m_colorTable2);
- else
- m_volumeItem->setColorTable(m_colorTable1);
+ if (m_volumeItem) {
+ if (enabled)
+ m_volumeItem->setColorTable(m_colorTable2);
+ else
+ m_volumeItem->setColorTable(m_colorTable1);
- m_usingPrimaryTable = !enabled;
+ m_usingPrimaryTable = !enabled;
- // Rerender image labels
- adjustSliceX(m_sliceSliderX->value());
- adjustSliceY(m_sliceSliderY->value());
- adjustSliceZ(m_sliceSliderZ->value());
+ // Rerender image labels
+ adjustSliceX(m_sliceSliderX->value());
+ adjustSliceY(m_sliceSliderY->value());
+ adjustSliceZ(m_sliceSliderZ->value());
+ }
}
void VolumetricModifier::setPreserveOpacity(bool enabled)
{
- //! [10]
- m_volumeItem->setPreserveOpacity(enabled);
- //! [10]
- // Rerender image labels
- adjustSliceX(m_sliceSliderX->value());
- adjustSliceY(m_sliceSliderY->value());
- adjustSliceZ(m_sliceSliderZ->value());
+ if (m_volumeItem) {
+ //! [10]
+ m_volumeItem->setPreserveOpacity(enabled);
+ //! [10]
+
+ // Rerender image labels
+ adjustSliceX(m_sliceSliderX->value());
+ adjustSliceY(m_sliceSliderY->value());
+ adjustSliceZ(m_sliceSliderZ->value());
+ }
}
void VolumetricModifier::setTransparentGround(bool enabled)
{
- //! [12]
- int newAlpha = enabled ? terrainTransparency : 255;
- for (int i = aboveWaterGroundColorsMin; i < underWaterGroundColorsMax; i++) {
- QRgb oldColor1 = m_colorTable1.at(i);
- QRgb oldColor2 = m_colorTable2.at(i);
- m_colorTable1[i] = qRgba(qRed(oldColor1), qGreen(oldColor1), qBlue(oldColor1), newAlpha);
- m_colorTable2[i] = qRgba(qRed(oldColor2), qGreen(oldColor2), qBlue(oldColor2), newAlpha);
+ if (m_volumeItem) {
+ //! [12]
+ int newAlpha = enabled ? terrainTransparency : 255;
+ for (int i = aboveWaterGroundColorsMin; i < underWaterGroundColorsMax; i++) {
+ QRgb oldColor1 = m_colorTable1.at(i);
+ QRgb oldColor2 = m_colorTable2.at(i);
+ m_colorTable1[i] = qRgba(qRed(oldColor1), qGreen(oldColor1), qBlue(oldColor1), newAlpha);
+ m_colorTable2[i] = qRgba(qRed(oldColor2), qGreen(oldColor2), qBlue(oldColor2), newAlpha);
+ }
+ if (m_usingPrimaryTable)
+ m_volumeItem->setColorTable(m_colorTable1);
+ else
+ m_volumeItem->setColorTable(m_colorTable2);
+ //! [12]
+ adjustSliceX(m_sliceSliderX->value());
+ adjustSliceY(m_sliceSliderY->value());
+ adjustSliceZ(m_sliceSliderZ->value());
}
- if (m_usingPrimaryTable)
- m_volumeItem->setColorTable(m_colorTable1);
- else
- m_volumeItem->setColorTable(m_colorTable2);
- //! [12]
- adjustSliceX(m_sliceSliderX->value());
- adjustSliceY(m_sliceSliderY->value());
- adjustSliceZ(m_sliceSliderZ->value());
}
void VolumetricModifier::setUseHighDefShader(bool enabled)
{
- //! [13]
- m_volumeItem->setUseHighDefShader(enabled);
- //! [13]
+ if (m_volumeItem) {
+ //! [13]
+ m_volumeItem->setUseHighDefShader(enabled);
+ //! [13]
+ }
}
void VolumetricModifier::adjustAlphaMultiplier(int value)
{
- float mult;
- if (value > 100)
- mult = float(value - 99) / 2.0f;
- else
- mult = float(value) / float(500 - value * 4);
- //! [11]
- m_volumeItem->setAlphaMultiplier(mult);
- //! [11]
- QString labelFormat = QStringLiteral("Alpha multiplier: %1");
- m_alphaMultiplierLabel->setText(labelFormat.arg(
- QString::number(m_volumeItem->alphaMultiplier(), 'f', 3)));
-
- // Rerender image labels
- adjustSliceX(m_sliceSliderX->value());
- adjustSliceY(m_sliceSliderY->value());
- adjustSliceZ(m_sliceSliderZ->value());
+ if (m_volumeItem) {
+ float mult;
+ if (value > 100)
+ mult = float(value - 99) / 2.0f;
+ else
+ mult = float(value) / float(500 - value * 4);
+ //! [11]
+ m_volumeItem->setAlphaMultiplier(mult);
+ //! [11]
+ QString labelFormat = QStringLiteral("Alpha multiplier: %1");
+ m_alphaMultiplierLabel->setText(labelFormat.arg(
+ QString::number(m_volumeItem->alphaMultiplier(), 'f', 3)));
+
+ // Rerender image labels
+ adjustSliceX(m_sliceSliderX->value());
+ adjustSliceY(m_sliceSliderY->value());
+ adjustSliceZ(m_sliceSliderZ->value());
+ }
}
void VolumetricModifier::toggleAreaAll(bool enabled)
diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp
index a0e0bc45..d0f3c04b 100644
--- a/src/datavisualization/engine/abstract3drenderer.cpp
+++ b/src/datavisualization/engine/abstract3drenderer.cpp
@@ -63,6 +63,7 @@ Abstract3DRenderer::Abstract3DRenderer(Abstract3DController *controller)
m_volumeTextureLowDefShader(0),
m_volumeTextureSliceShader(0),
m_volumeSliceFrameShader(0),
+ m_labelShader(0),
m_useOrthoProjection(false),
m_xFlipped(false),
m_yFlipped(false),
@@ -108,6 +109,7 @@ Abstract3DRenderer::~Abstract3DRenderer()
delete m_volumeTextureLowDefShader;
delete m_volumeSliceFrameShader;
delete m_volumeTextureSliceShader;
+ delete m_labelShader;
foreach (SeriesRenderCache *cache, m_renderCacheList) {
cache->cleanup(m_textureHelper);
@@ -152,6 +154,9 @@ void Abstract3DRenderer::initializeOpenGL()
axisCacheForOrientation(QAbstract3DAxis::AxisOrientationX).setDrawer(m_drawer);
axisCacheForOrientation(QAbstract3DAxis::AxisOrientationY).setDrawer(m_drawer);
axisCacheForOrientation(QAbstract3DAxis::AxisOrientationZ).setDrawer(m_drawer);
+
+ initLabelShaders(QStringLiteral(":/shaders/vertexLabel"),
+ QStringLiteral(":/shaders/fragmentLabel"));
}
void Abstract3DRenderer::render(const GLuint defaultFboHandle)
@@ -232,6 +237,13 @@ void Abstract3DRenderer::initVolumeTextureShaders(const QString &vertexShader,
m_volumeSliceFrameShader->initialize();
}
+void Abstract3DRenderer::initLabelShaders(const QString &vertexShader, const QString &fragmentShader)
+{
+ delete m_labelShader;
+ m_labelShader = new ShaderHelper(this, vertexShader, fragmentShader);
+ m_labelShader->initialize();
+}
+
void Abstract3DRenderer::updateTheme(Q3DTheme *theme)
{
// Synchronize the controller theme with renderer
@@ -1366,8 +1378,8 @@ void Abstract3DRenderer::drawCustomItems(RenderingState state,
if (RenderingNormal == state) {
// Normal render
-#if !defined(QT_OPENGL_ES_2)
ShaderHelper *prevShader = shader;
+#if !defined(QT_OPENGL_ES_2)
if (item->isVolume()) {
if (item->drawSlices() &&
(item->sliceIndexX() >= 0
@@ -1379,12 +1391,14 @@ void Abstract3DRenderer::drawCustomItems(RenderingState state,
} else {
shader = m_volumeTextureLowDefShader;
}
- } else {
+ } else
+#endif
+ if (item->isLabel())
+ shader = m_labelShader;
+ else
shader = regularShader;
- }
if (shader != prevShader)
shader->bind();
-#endif
shader->setUniformValue(shader->model(), modelMatrix);
shader->setUniformValue(shader->MVP(), MVPMatrix);
shader->setUniformValue(shader->nModel(), itModelMatrix.inverted().transposed());
diff --git a/src/datavisualization/engine/abstract3drenderer_p.h b/src/datavisualization/engine/abstract3drenderer_p.h
index 2072314b..a46e6176 100644
--- a/src/datavisualization/engine/abstract3drenderer_p.h
+++ b/src/datavisualization/engine/abstract3drenderer_p.h
@@ -98,6 +98,8 @@ public:
const QString &sliceShader,
const QString &sliceFrameVertexShader,
const QString &sliceFrameShader);
+ virtual void initLabelShaders(const QString &vertexShader, const QString &fragmentShader);
+
virtual void updateAxisType(QAbstract3DAxis::AxisOrientation orientation,
QAbstract3DAxis::AxisType type);
virtual void updateAxisTitle(QAbstract3DAxis::AxisOrientation orientation,
@@ -253,6 +255,7 @@ protected:
ShaderHelper *m_volumeTextureLowDefShader;
ShaderHelper *m_volumeTextureSliceShader;
ShaderHelper *m_volumeSliceFrameShader;
+ ShaderHelper *m_labelShader;
bool m_useOrthoProjection;
bool m_xFlipped;
diff --git a/src/datavisualization/engine/bars3drenderer.cpp b/src/datavisualization/engine/bars3drenderer.cpp
index 1f395422..e9cd9d43 100644
--- a/src/datavisualization/engine/bars3drenderer.cpp
+++ b/src/datavisualization/engine/bars3drenderer.cpp
@@ -47,7 +47,6 @@ Bars3DRenderer::Bars3DRenderer(Bars3DController *controller)
m_depthShader(0),
m_selectionShader(0),
m_backgroundShader(0),
- m_labelShader(0),
m_bgrTexture(0),
m_selectionTexture(0),
m_depthFrameBuffer(0),
@@ -102,7 +101,6 @@ Bars3DRenderer::~Bars3DRenderer()
delete m_depthShader;
delete m_selectionShader;
delete m_backgroundShader;
- delete m_labelShader;
}
void Bars3DRenderer::initializeOpenGL()
@@ -110,8 +108,6 @@ void Bars3DRenderer::initializeOpenGL()
Abstract3DRenderer::initializeOpenGL();
// Initialize shaders
- initLabelShaders(QStringLiteral(":/shaders/vertexLabel"),
- QStringLiteral(":/shaders/fragmentLabel"));
#if !defined(QT_OPENGL_ES_2)
// Init depth shader (for shadows). Init in any case, easier to handle shadow activation if done via api.
@@ -2814,14 +2810,6 @@ void Bars3DRenderer::initBackgroundShaders(const QString &vertexShader,
m_backgroundShader->initialize();
}
-void Bars3DRenderer::initLabelShaders(const QString &vertexShader, const QString &fragmentShader)
-{
- if (m_labelShader)
- delete m_labelShader;
- m_labelShader = new ShaderHelper(this, vertexShader, fragmentShader);
- m_labelShader->initialize();
-}
-
QVector3D Bars3DRenderer::convertPositionToTranslation(const QVector3D &position, bool isAbsolute)
{
float xTrans = 0.0f;
diff --git a/src/datavisualization/engine/bars3drenderer_p.h b/src/datavisualization/engine/bars3drenderer_p.h
index 7f1e83bb..47c9ab1d 100644
--- a/src/datavisualization/engine/bars3drenderer_p.h
+++ b/src/datavisualization/engine/bars3drenderer_p.h
@@ -66,7 +66,6 @@ private:
ShaderHelper *m_depthShader;
ShaderHelper *m_selectionShader;
ShaderHelper *m_backgroundShader;
- ShaderHelper *m_labelShader;
GLuint m_bgrTexture;
GLuint m_selectionTexture;
GLuint m_depthFrameBuffer;
@@ -164,7 +163,6 @@ private:
void loadBackgroundMesh();
void initSelectionShader();
void initBackgroundShaders(const QString &vertexShader, const QString &fragmentShader);
- void initLabelShaders(const QString &vertexShader, const QString &fragmentShader);
void initSelectionBuffer();
#if !defined(QT_OPENGL_ES_2)
void initDepthShader();
diff --git a/src/datavisualization/engine/scatter3drenderer.cpp b/src/datavisualization/engine/scatter3drenderer.cpp
index 22d40a74..e9e395be 100644
--- a/src/datavisualization/engine/scatter3drenderer.cpp
+++ b/src/datavisualization/engine/scatter3drenderer.cpp
@@ -49,7 +49,6 @@ Scatter3DRenderer::Scatter3DRenderer(Scatter3DController *controller)
m_depthShader(0),
m_selectionShader(0),
m_backgroundShader(0),
- m_labelShader(0),
m_staticGradientPointShader(0),
m_bgrTexture(0),
m_selectionTexture(0),
@@ -93,7 +92,6 @@ Scatter3DRenderer::~Scatter3DRenderer()
delete m_depthShader;
delete m_selectionShader;
delete m_backgroundShader;
- delete m_labelShader;
delete m_staticGradientPointShader;
}
@@ -102,8 +100,6 @@ void Scatter3DRenderer::initializeOpenGL()
Abstract3DRenderer::initializeOpenGL();
// Initialize shaders
- initLabelShaders(QStringLiteral(":/shaders/vertexLabel"),
- QStringLiteral(":/shaders/fragmentLabel"));
#if !defined(QT_OPENGL_ES_2)
// Init depth shader (for shadows). Init in any case, easier to handle shadow activation if done via api.
@@ -2260,14 +2256,6 @@ void Scatter3DRenderer::initBackgroundShaders(const QString &vertexShader,
m_backgroundShader->initialize();
}
-void Scatter3DRenderer::initLabelShaders(const QString &vertexShader, const QString &fragmentShader)
-{
- if (m_labelShader)
- delete m_labelShader;
- m_labelShader = new ShaderHelper(this, vertexShader, fragmentShader);
- m_labelShader->initialize();
-}
-
void Scatter3DRenderer::initStaticPointShaders(const QString &vertexShader,
const QString &fragmentShader)
{
@@ -2277,7 +2265,6 @@ void Scatter3DRenderer::initStaticPointShaders(const QString &vertexShader,
m_staticGradientPointShader->initialize();
}
-
void Scatter3DRenderer::selectionColorToSeriesAndIndex(const QVector4D &color,
int &index,
QAbstract3DSeries *&series)
diff --git a/src/datavisualization/engine/scatter3drenderer_p.h b/src/datavisualization/engine/scatter3drenderer_p.h
index 0852f262..d8908e59 100644
--- a/src/datavisualization/engine/scatter3drenderer_p.h
+++ b/src/datavisualization/engine/scatter3drenderer_p.h
@@ -59,7 +59,6 @@ private:
ShaderHelper *m_depthShader;
ShaderHelper *m_selectionShader;
ShaderHelper *m_backgroundShader;
- ShaderHelper *m_labelShader;
ShaderHelper *m_staticGradientPointShader;
GLuint m_bgrTexture;
GLuint m_selectionTexture;
@@ -130,7 +129,6 @@ private:
void loadBackgroundMesh();
void initSelectionShader();
void initBackgroundShaders(const QString &vertexShader, const QString &fragmentShader);
- void initLabelShaders(const QString &vertexShader, const QString &fragmentShader);
void initStaticPointShaders(const QString &vertexShader, const QString &fragmentShader);
void initSelectionBuffer();
#if !defined(QT_OPENGL_ES_2)
diff --git a/src/datavisualization/engine/surface3drenderer.cpp b/src/datavisualization/engine/surface3drenderer.cpp
index 9bee6b30..9121e37c 100644
--- a/src/datavisualization/engine/surface3drenderer.cpp
+++ b/src/datavisualization/engine/surface3drenderer.cpp
@@ -49,7 +49,6 @@ Surface3DRenderer::Surface3DRenderer(Surface3DController *controller)
m_surfaceSliceFlatShader(0),
m_surfaceSliceSmoothShader(0),
m_selectionShader(0),
- m_labelShader(0),
m_heightNormalizer(0.0f),
m_scaleX(0.0f),
m_scaleY(0.0f),
@@ -110,7 +109,6 @@ Surface3DRenderer::~Surface3DRenderer()
delete m_surfaceGridShader;
delete m_surfaceSliceFlatShader;
delete m_surfaceSliceSmoothShader;
- delete m_labelShader;
}
void Surface3DRenderer::initializeOpenGL()
@@ -119,8 +117,6 @@ void Surface3DRenderer::initializeOpenGL()
// Initialize shaders
initSurfaceShaders();
- initLabelShaders(QStringLiteral(":/shaders/vertexLabel"),
- QStringLiteral(":/shaders/fragmentLabel"));
#if !defined(QT_OPENGL_ES_2)
// Init depth shader (for shadows). Init in any case, easier to handle shadow activation if done via api.
@@ -2956,14 +2952,6 @@ void Surface3DRenderer::initSurfaceShaders()
handleShadowQualityChange();
}
-void Surface3DRenderer::initLabelShaders(const QString &vertexShader, const QString &fragmentShader)
-{
- if (m_labelShader)
- delete m_labelShader;
- m_labelShader = new ShaderHelper(this, vertexShader, fragmentShader);
- m_labelShader->initialize();
-}
-
#if !defined(QT_OPENGL_ES_2)
void Surface3DRenderer::initDepthShader()
{
diff --git a/src/datavisualization/engine/surface3drenderer_p.h b/src/datavisualization/engine/surface3drenderer_p.h
index 623951d4..cba1b959 100644
--- a/src/datavisualization/engine/surface3drenderer_p.h
+++ b/src/datavisualization/engine/surface3drenderer_p.h
@@ -57,7 +57,6 @@ private:
ShaderHelper *m_surfaceSliceFlatShader;
ShaderHelper *m_surfaceSliceSmoothShader;
ShaderHelper *m_selectionShader;
- ShaderHelper *m_labelShader;
float m_heightNormalizer;
float m_scaleX;
float m_scaleY;
@@ -137,7 +136,6 @@ private:
void calculateSceneScalingFactors();
void initBackgroundShaders(const QString &vertexShader, const QString &fragmentShader);
- void initLabelShaders(const QString &vertexShader, const QString &fragmentShader);
void initSelectionShaders();
void initSurfaceShaders();
void initSelectionBuffer();