diff options
author | Miikka Heikkinen <miikka.heikkinen@digia.com> | 2014-09-19 11:05:27 +0300 |
---|---|---|
committer | Miikka Heikkinen <miikka.heikkinen@digia.com> | 2014-09-19 11:12:11 +0300 |
commit | 105e85170d35f7086dc96d1853298fcf8d680e06 (patch) | |
tree | 295d8fd37832014ce1e65ab12d57f6aae757740b | |
parent | 98e0c04fe78da9735c2943524bd36648b2654f98 (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.cpp | 138 | ||||
-rw-r--r-- | src/datavisualization/engine/abstract3drenderer.cpp | 22 | ||||
-rw-r--r-- | src/datavisualization/engine/abstract3drenderer_p.h | 3 | ||||
-rw-r--r-- | src/datavisualization/engine/bars3drenderer.cpp | 12 | ||||
-rw-r--r-- | src/datavisualization/engine/bars3drenderer_p.h | 2 | ||||
-rw-r--r-- | src/datavisualization/engine/scatter3drenderer.cpp | 13 | ||||
-rw-r--r-- | src/datavisualization/engine/scatter3drenderer_p.h | 2 | ||||
-rw-r--r-- | src/datavisualization/engine/surface3drenderer.cpp | 12 | ||||
-rw-r--r-- | src/datavisualization/engine/surface3drenderer_p.h | 2 |
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(); |