/**************************************************************************** ** ** Copyright (C) 2014 Digia Plc ** All rights reserved. ** For any questions to Digia, please use contact form at http://qt.io ** ** This file is part of the Qt Data Visualization module. ** ** Licensees holding valid commercial license for Qt may use this file in ** accordance with the Qt License Agreement provided with the Software ** or, alternatively, in accordance with the terms contained in a written ** agreement between you and Digia. ** ** If you have questions regarding the use of this file, please use ** contact form at http://qt.io ** ****************************************************************************/ #include "seriesrendercache_p.h" #include "abstract3drenderer_p.h" #include "texturehelper_p.h" #include "utils_p.h" QT_BEGIN_NAMESPACE_DATAVISUALIZATION const QString smoothString(QStringLiteral("Smooth")); SeriesRenderCache::SeriesRenderCache(QAbstract3DSeries *series, Abstract3DRenderer *renderer) : m_series(series), m_object(0), m_mesh(QAbstract3DSeries::MeshCube), m_baseUniformTexture(0), m_baseGradientTexture(0), m_gradientImage(0), m_singleHighlightGradientTexture(0), m_multiHighlightGradientTexture(0), m_valid(false), m_visible(false), m_renderer(renderer), m_objectDirty(true), m_staticObjectUVDirty(false) { } SeriesRenderCache::~SeriesRenderCache() { } void SeriesRenderCache::populate(bool newSeries) { QAbstract3DSeriesChangeBitField &changeTracker = m_series->d_ptr->m_changeTracker; if (newSeries || changeTracker.meshChanged || changeTracker.meshSmoothChanged || changeTracker.userDefinedMeshChanged) { m_mesh = m_series->mesh(); changeTracker.meshChanged = false; changeTracker.meshSmoothChanged = false; changeTracker.userDefinedMeshChanged = false; QString meshFileName; // Compose mesh filename if (m_mesh == QAbstract3DSeries::MeshUserDefined) { // Always use the supplied mesh directly meshFileName = m_series->userDefinedMesh(); } else { switch (m_mesh) { case QAbstract3DSeries::MeshBar: case QAbstract3DSeries::MeshCube: meshFileName = QStringLiteral(":/defaultMeshes/bar"); break; case QAbstract3DSeries::MeshPyramid: meshFileName = QStringLiteral(":/defaultMeshes/pyramid"); break; case QAbstract3DSeries::MeshCone: meshFileName = QStringLiteral(":/defaultMeshes/cone"); break; case QAbstract3DSeries::MeshCylinder: meshFileName = QStringLiteral(":/defaultMeshes/cylinder"); break; case QAbstract3DSeries::MeshBevelBar: case QAbstract3DSeries::MeshBevelCube: meshFileName = QStringLiteral(":/defaultMeshes/bevelbar"); break; case QAbstract3DSeries::MeshSphere: meshFileName = QStringLiteral(":/defaultMeshes/sphere"); break; case QAbstract3DSeries::MeshMinimal: meshFileName = QStringLiteral(":/defaultMeshes/minimal"); break; case QAbstract3DSeries::MeshArrow: meshFileName = QStringLiteral(":/defaultMeshes/arrow"); break; case QAbstract3DSeries::MeshPoint: if (Utils::isOpenGLES()) qWarning("QAbstract3DSeries::MeshPoint is not fully supported on OpenGL ES2"); break; default: // Default to cube meshFileName = QStringLiteral(":/defaultMeshes/bar"); break; } if (m_series->isMeshSmooth() && m_mesh != QAbstract3DSeries::MeshPoint) meshFileName += smoothString; // Give renderer an opportunity to customize the mesh m_renderer->fixMeshFileName(meshFileName, m_mesh); } ObjectHelper::resetObjectHelper(m_renderer, m_object, meshFileName); } if (newSeries || changeTracker.meshRotationChanged) { m_meshRotation = m_series->meshRotation().normalized(); if (m_series->type() == QAbstract3DSeries::SeriesTypeBar && (m_meshRotation.x() || m_meshRotation.z())) { m_meshRotation = identityQuaternion; } changeTracker.meshRotationChanged = false; } if (newSeries || changeTracker.colorStyleChanged) { m_colorStyle = m_series->colorStyle(); changeTracker.colorStyleChanged = false; } if (newSeries || changeTracker.baseColorChanged) { m_baseColor = Utils::vectorFromColor(m_series->baseColor()); if (m_series->type() == QAbstract3DSeries::SeriesTypeSurface) m_renderer->generateBaseColorTexture(m_series->baseColor(), &m_baseUniformTexture); changeTracker.baseColorChanged = false; } if (newSeries || changeTracker.baseGradientChanged) { QLinearGradient gradient = m_series->baseGradient(); m_gradientImage = Utils::getGradientImage(gradient); m_renderer->fixGradientAndGenerateTexture(&gradient, &m_baseGradientTexture); changeTracker.baseGradientChanged = false; } if (newSeries || changeTracker.singleHighlightColorChanged) { m_singleHighlightColor = Utils::vectorFromColor(m_series->singleHighlightColor()); changeTracker.singleHighlightColorChanged = false; } if (newSeries || changeTracker.singleHighlightGradientChanged) { QLinearGradient gradient = m_series->singleHighlightGradient(); m_renderer->fixGradientAndGenerateTexture(&gradient, &m_singleHighlightGradientTexture); changeTracker.singleHighlightGradientChanged = false; } if (newSeries || changeTracker.multiHighlightColorChanged) { m_multiHighlightColor = Utils::vectorFromColor(m_series->multiHighlightColor()); changeTracker.multiHighlightColorChanged = false; } if (newSeries || changeTracker.multiHighlightGradientChanged) { QLinearGradient gradient = m_series->multiHighlightGradient(); m_renderer->fixGradientAndGenerateTexture(&gradient, &m_multiHighlightGradientTexture); changeTracker.multiHighlightGradientChanged = false; } if (newSeries || changeTracker.nameChanged) { m_name = m_series->name(); changeTracker.nameChanged = false; } if (newSeries || changeTracker.itemLabelChanged || changeTracker.itemLabelVisibilityChanged) { changeTracker.itemLabelChanged = false; changeTracker.itemLabelVisibilityChanged = false; // series->itemLabel() call resolves the item label and emits the changed signal // if it is dirty, so we need to call it even if m_itemLabel is eventually set // to an empty string. m_itemLabel = m_series->itemLabel(); if (!m_series->isItemLabelVisible()) m_itemLabel = QString(); } if (newSeries || changeTracker.visibilityChanged) { m_visible = m_series->isVisible(); changeTracker.visibilityChanged = false; } } void SeriesRenderCache::cleanup(TextureHelper *texHelper) { ObjectHelper::releaseObjectHelper(m_renderer, m_object); if (QOpenGLContext::currentContext()) { texHelper->deleteTexture(&m_baseUniformTexture); texHelper->deleteTexture(&m_baseGradientTexture); texHelper->deleteTexture(&m_singleHighlightGradientTexture); texHelper->deleteTexture(&m_multiHighlightGradientTexture); } } QT_END_NAMESPACE_DATAVISUALIZATION