diff options
Diffstat (limited to 'src/datavisualization/engine/surface3drenderer.cpp')
-rw-r--r-- | src/datavisualization/engine/surface3drenderer.cpp | 97 |
1 files changed, 44 insertions, 53 deletions
diff --git a/src/datavisualization/engine/surface3drenderer.cpp b/src/datavisualization/engine/surface3drenderer.cpp index 81da15da..ecb9696b 100644 --- a/src/datavisualization/engine/surface3drenderer.cpp +++ b/src/datavisualization/engine/surface3drenderer.cpp @@ -34,8 +34,6 @@ #include <QMouseEvent> #include <qmath.h> -#include <QLinearGradient> - #include <QDebug> static const int ID_TO_RGBA_MASK = 0xff; @@ -95,7 +93,6 @@ Surface3DRenderer::Surface3DRenderer(Surface3DController *controller) m_depthFrameBuffer(0), m_selectionFrameBuffer(0), m_selectionDepthBuffer(0), - m_gradientTexture(0), m_selectionTexture(0), m_selectionResultTexture(0), m_shadowQualityToShader(33.3f), @@ -113,7 +110,8 @@ Surface3DRenderer::Surface3DRenderer(Surface3DController *controller) m_clickedPointId(invalidSelectionId), m_hasHeightAdjustmentChanged(true), m_selectedPoint(Surface3DController::invalidSelectionPosition()), - m_selectedSeries(0) + m_selectedSeries(0), + m_uniformGradientTexture(0) { // Check if flat feature is supported ShaderHelper tester(this, QStringLiteral(":/shaders/vertexSurfaceFlat"), @@ -129,6 +127,9 @@ Surface3DRenderer::Surface3DRenderer(Surface3DController *controller) initializeOpenGLFunctions(); initializeOpenGL(); + + // Create initial uniform gradient + generateUniformGradient(m_uniformGradientTextureColor); } Surface3DRenderer::~Surface3DRenderer() @@ -139,9 +140,9 @@ Surface3DRenderer::~Surface3DRenderer() m_textureHelper->deleteTexture(&m_depthTexture); m_textureHelper->deleteTexture(&m_depthModelTexture); - m_textureHelper->deleteTexture(&m_gradientTexture); m_textureHelper->deleteTexture(&m_selectionTexture); m_textureHelper->deleteTexture(&m_selectionResultTexture); + m_textureHelper->deleteTexture(&m_uniformGradientTexture); delete m_shader; delete m_depthShader; @@ -282,6 +283,11 @@ void Surface3DRenderer::updateSeries(const QList<QAbstract3DSeries *> &seriesLis QSurface3DSeries *series = static_cast<QSurface3DSeries *>(m_visibleSeriesList.at(0).series()); updateFlatStatus(series->isFlatShadingEnabled()); updateSurfaceGridStatus(series->isSurfaceGridEnabled()); + QVector3D seriesColor = Utils::vectorFromColor(series->baseColor()); + if (m_uniformGradientTextureColor != seriesColor) + generateUniformGradient(seriesColor); + if (m_selectionPointer) + m_selectionPointer->setHighlightColor(Utils::vectorFromColor(series->singleHighlightColor())); } } @@ -634,8 +640,6 @@ void Surface3DRenderer::drawSlicedScene() m_cachedTheme->ambientLightStrength() * 2.0f); m_drawer->drawObject(surfaceShader, m_sliceSurfaceObj); - - surfaceShader->release(); } // Draw surface grid @@ -645,7 +649,6 @@ void Surface3DRenderer::drawSlicedScene() Utils::vectorFromColor(m_cachedTheme->gridLineColor())); m_surfaceGridShader->setUniformValue(m_surfaceGridShader->MVP(), MVPMatrix); m_drawer->drawSurfaceGrid(m_surfaceGridShader, m_sliceSurfaceObj); - m_surfaceGridShader->release(); glDisable(GL_POLYGON_OFFSET_FILL); } @@ -739,9 +742,6 @@ void Surface3DRenderer::drawSlicedScene() linePos += lineStep; } - - // Release line shader - lineShader->release(); } // Draw axis labels @@ -821,8 +821,8 @@ void Surface3DRenderer::drawSlicedScene() glEnable(GL_DEPTH_TEST); glDisable(GL_BLEND); - // Release label shader - m_labelShader->release(); + // Release shader + glUseProgram(0); } void Surface3DRenderer::drawScene(GLuint defaultFboHandle) @@ -957,9 +957,6 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) // Disable drawing to depth framebuffer (= enable drawing to screen) glBindFramebuffer(GL_FRAMEBUFFER, defaultFboHandle); - // Release depth shader - m_depthShader->release(); - // Revert to original viewport glViewport(m_mainViewPort.x(), m_mainViewPort.y(), m_mainViewPort.width(), m_mainViewPort.height()); @@ -980,7 +977,6 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) m_labelShader->setUniformValue(m_labelShader->MVP(), MVPMatrix); m_drawer->drawObject(m_labelShader, m_labelObj, m_depthTexture); glDisable(GL_TEXTURE_2D); - m_labelShader->release(); } #endif } @@ -1022,9 +1018,6 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) glBindFramebuffer(GL_FRAMEBUFFER, defaultFboHandle); - // Release selection shader - m_selectionShader->release(); - // Put the RGBA value back to uint #if !defined(QT_OPENGL_ES_2) uint selectionId = pixel[0] + pixel[1] * 256 + pixel[2] * 65536 + pixel[3] * 16777216; @@ -1071,6 +1064,13 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) m_surfaceShader->setUniformValue(m_surfaceShader->ambientS(), m_cachedTheme->ambientLightStrength()); + // TODO: Do properly when multiseries support implemented QTRD-2657 + GLuint gradientTexture; + if (m_visibleSeriesList.at(0).colorStyle() == Q3DTheme::ColorStyleUniform) + gradientTexture = m_uniformGradientTexture; + else + gradientTexture = m_visibleSeriesList.at(0).baseGradientTexture(); + #if !defined(QT_OPENGL_ES_2) if (m_cachedShadowQuality > QDataVis::ShadowQualityNone) { // Set shadow shader bindings @@ -1080,7 +1080,7 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) m_surfaceShader->setUniformValue(m_surfaceShader->lightS(), adjustedLightStrength); // Draw the object - m_drawer->drawObject(m_surfaceShader, m_surfaceObj, m_gradientTexture, m_depthModelTexture); + m_drawer->drawObject(m_surfaceShader, m_surfaceObj, gradientTexture, m_depthModelTexture); } else #endif { @@ -1089,11 +1089,8 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) m_cachedTheme->lightStrength()); // Draw the object - m_drawer->drawObject(m_surfaceShader, m_surfaceObj, m_gradientTexture); + m_drawer->drawObject(m_surfaceShader, m_surfaceObj, gradientTexture); } - - m_surfaceShader->release(); - glEnable(GL_CULL_FACE); } @@ -1104,7 +1101,6 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) Utils::vectorFromColor(m_cachedTheme->gridLineColor())); m_surfaceGridShader->setUniformValue(m_surfaceGridShader->MVP(), MVPMatrix); m_drawer->drawSurfaceGrid(m_surfaceGridShader, m_surfaceObj); - m_surfaceGridShader->release(); glDisable(GL_POLYGON_OFFSET_FILL); } @@ -1176,9 +1172,6 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) } } - // Release background shader - m_backgroundShader->release(); - // Draw grid lines QVector3D gridLineScaleX(m_scaleXWithBackground, gridLineWidth, gridLineWidth); QVector3D gridLineScaleZ(gridLineWidth, gridLineWidth, m_scaleZWithBackground); @@ -1502,9 +1495,6 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) linePos += lineStep; } } - - // Release line shader - lineShader->release(); } // Draw axis labels @@ -1679,8 +1669,8 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) glDisable(GL_TEXTURE_2D); glDisable(GL_BLEND); - // Release label shader - m_labelShader->release(); + // Release shader + glUseProgram(0); // Selection handling if (m_selectionDirty) { @@ -1710,20 +1700,6 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) } } -void Surface3DRenderer::updateSurfaceGradient(const QLinearGradient &gradient) -{ - if (m_gradientTexture) { - m_textureHelper->deleteTexture(&m_gradientTexture); - m_gradientTexture = 0; - } - - QLinearGradient adjustedGradient = gradient; - adjustedGradient.setStart(qreal(gradientTextureWidth), qreal(gradientTextureHeight)); - adjustedGradient.setFinalStop(0.0, 0.0); - - m_gradientTexture = m_textureHelper->createGradientTexture(adjustedGradient); -} - // This one needs to be called when the data size changes void Surface3DRenderer::updateSelectionTexture() { @@ -1811,11 +1787,6 @@ void Surface3DRenderer::idToRGBA(uint id, uchar *r, uchar *g, uchar *b, uchar *a *a = (id >> 24) & ID_TO_RGBA_MASK; } -void Surface3DRenderer::updateTextures() -{ - updateSurfaceGradient(m_cachedTheme->baseGradient()); -} - void Surface3DRenderer::calculateSceneScalingFactors() { // Calculate scene scaling and translation factors @@ -1954,6 +1925,7 @@ void Surface3DRenderer::surfacePointSelected(const QPoint &point) m_selectionPointer->setLabel(createSelectionLabel(value, column, row)); // TODO: Get pointer object from correct series once multiseries support implemented m_selectionPointer->setPointerObject(m_visibleSeriesList.at(0).object()); + m_selectionPointer->setHighlightColor(m_visibleSeriesList.at(0).singleHighlightColor()); m_selectionPointer->updateScene(m_cachedScene); } @@ -2049,6 +2021,11 @@ void Surface3DRenderer::updateShadowQuality(QDataVis::ShadowQuality quality) #endif } +void Surface3DRenderer::updateTextures() +{ + // Do nothing, but required as it is pure virtual on parent +} + void Surface3DRenderer::updateSlicingActive(bool isSlicing) { if (m_cachedIsSlicingActivated == isSlicing) @@ -2098,6 +2075,7 @@ void Surface3DRenderer::loadLabelMesh() void Surface3DRenderer::initShaders(const QString &vertexShader, const QString &fragmentShader) { + // m_shader is used slice view surface only. if (m_shader) delete m_shader; m_shader = new ShaderHelper(this, vertexShader, fragmentShader); @@ -2201,6 +2179,19 @@ void Surface3DRenderer::updateDepthBuffer() lowerShadowQuality(); } } + +void Surface3DRenderer::generateUniformGradient(const QVector3D newColor) +{ + if (m_visibleSeriesList.size()) { + // TODO: move uniform gradient to render cache when multiseries support implemented QTRD-2657 + QColor newQColor = Utils::colorFromVector(newColor); + m_uniformGradientTextureColor = newColor; + QLinearGradient newGradient; + newGradient.setColorAt(0.0, newQColor); + newGradient.setColorAt(1.0, newQColor); + fixGradient(&newGradient, &m_uniformGradientTexture); + } +} #endif QT_DATAVISUALIZATION_END_NAMESPACE |