summaryrefslogtreecommitdiffstats
path: root/src/datavisualization/engine/bars3drenderer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/datavisualization/engine/bars3drenderer.cpp')
-rw-r--r--src/datavisualization/engine/bars3drenderer.cpp81
1 files changed, 40 insertions, 41 deletions
diff --git a/src/datavisualization/engine/bars3drenderer.cpp b/src/datavisualization/engine/bars3drenderer.cpp
index 142640b3..addad904 100644
--- a/src/datavisualization/engine/bars3drenderer.cpp
+++ b/src/datavisualization/engine/bars3drenderer.cpp
@@ -64,7 +64,6 @@ Bars3DRenderer::Bars3DRenderer(Bars3DController *controller)
m_selectionShader(0),
m_backgroundShader(0),
m_labelShader(0),
- m_barObj(0),
m_backgroundObj(0),
m_gridLineObj(0),
m_labelObj(0),
@@ -114,7 +113,6 @@ Bars3DRenderer::~Bars3DRenderer()
delete m_depthShader;
delete m_selectionShader;
delete m_backgroundShader;
- delete m_barObj;
delete m_backgroundObj;
delete m_gridLineObj;
delete m_labelObj;
@@ -297,9 +295,6 @@ void Bars3DRenderer::drawSlicedScene(const LabelItem &xLabel,
const LabelItem &zLabel)
{
GLfloat barPosX = 0;
- GLint startBar = 0;
- GLint stopBar = m_sliceSelection->size();
- GLint stepBar = 1;
QVector3D lightPos;
// Specify viewport
@@ -484,7 +479,8 @@ void Bars3DRenderer::drawSlicedScene(const LabelItem &xLabel,
gradientTexture = m_objectGradientTexture;
}
- for (int bar = startBar; bar != stopBar; bar += stepBar) {
+ int stopBar = m_sliceSelection->size();
+ for (int bar = 0; bar < stopBar; bar++) {
BarRenderItem *item = m_sliceSelection->at(bar);
if (!item)
continue;
@@ -517,6 +513,7 @@ void Bars3DRenderer::drawSlicedScene(const LabelItem &xLabel,
MVPMatrix = projectionViewMatrix * modelMatrix;
QVector3D barColor;
+ // TODO: Get color from correct series
if (itemMode && m_visualSelectedBarPos.x() == item->position().x()
&& m_visualSelectedBarPos.y() == item->position().y()) {
if (m_cachedColorStyle == QDataVis::ColorStyleUniform)
@@ -544,7 +541,9 @@ void Bars3DRenderer::drawSlicedScene(const LabelItem &xLabel,
}
// Draw the object
- m_drawer->drawObject(m_barShader, m_barObj, gradientTexture);
+ m_drawer->drawObject(m_barShader,
+ m_visibleSeriesList.at(item->seriesIndex()).object(),
+ gradientTexture);
}
}
@@ -591,7 +590,8 @@ void Bars3DRenderer::drawSlicedScene(const LabelItem &xLabel,
// TODO: Maybe use selection label instead of value? Should it be user controllable
// as well? (QTRD-2546)
if (itemMode && m_visualSelectedBarPos.x() == item->position().x()
- && m_visualSelectedBarPos.y() == item->position().y()) {
+ && m_visualSelectedBarPos.y() == item->position().y()
+ && item->seriesIndex() == m_visualSelectedBarSeriesIndex) {
m_drawer->drawLabel(*item, item->sliceLabelItem(), viewMatrix, projectionMatrix,
valuePositionComp, sliceValueRotation, item->height(),
m_cachedSelectionMode, m_labelShader, m_labelObj, activeCamera,
@@ -785,6 +785,7 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle)
const BarRenderItem &item = m_renderingArrays.at(series).at(row).at(bar);
if (!item.value())
continue;
+ ObjectHelper *barObj = m_visibleSeriesList.at(series).object();
// Set front face culling for negative valued bars and back face culling for
// positive valued bars to remove peter-panning issues
if (item.height() > 0) {
@@ -818,15 +819,15 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle)
// 1st attribute buffer : vertices
glEnableVertexAttribArray(m_depthShader->posAtt());
- glBindBuffer(GL_ARRAY_BUFFER, m_barObj->vertexBuf());
+ glBindBuffer(GL_ARRAY_BUFFER, barObj->vertexBuf());
glVertexAttribPointer(m_depthShader->posAtt(), 3, GL_FLOAT, GL_FALSE, 0,
(void *)0);
// Index buffer
- glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_barObj->elementBuf());
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, barObj->elementBuf());
// Draw the triangles
- glDrawElements(GL_TRIANGLES, m_barObj->indexCount(), GL_UNSIGNED_SHORT,
+ glDrawElements(GL_TRIANGLES, barObj->indexCount(), GL_UNSIGNED_SHORT,
(void *)0);
// Free buffers
@@ -890,6 +891,7 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle)
seriesPos += m_seriesStep;
continue;
}
+ ObjectHelper *barObj = m_visibleSeriesList.at(series).object();
if (item.height() < 0)
glCullFace(GL_FRONT);
@@ -926,15 +928,15 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle)
// 1st attribute buffer : vertices
glEnableVertexAttribArray(m_selectionShader->posAtt());
- glBindBuffer(GL_ARRAY_BUFFER, m_barObj->vertexBuf());
+ glBindBuffer(GL_ARRAY_BUFFER, barObj->vertexBuf());
glVertexAttribPointer(m_selectionShader->posAtt(), 3, GL_FLOAT, GL_FALSE, 0,
(void *)0);
// Index buffer
- glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_barObj->elementBuf());
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, barObj->elementBuf());
// Draw the triangles
- glDrawElements(GL_TRIANGLES, m_barObj->indexCount(), GL_UNSIGNED_SHORT,
+ glDrawElements(GL_TRIANGLES, barObj->indexCount(), GL_UNSIGNED_SHORT,
(void *)0);
// Free buffers
@@ -1001,6 +1003,14 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle)
if (m_sliceSelection && m_sliceSelection->size()) {
// Slice doesn't own its items, no need to delete them - just clear
m_sliceSelection->clear();
+ int reserveAmount = 0;
+ if (rowMode)
+ reserveAmount = m_renderColumns;
+ else
+ reserveAmount = m_renderRows;
+ if (m_cachedSelectionMode.testFlag(QDataVis::SelectionMultiSeries))
+ reserveAmount *= m_visibleSeriesList.size();
+ m_sliceSelection->reserve(reserveAmount);
}
// Set slice cache, i.e. axis cache from where slice labels are taken
if (rowMode)
@@ -1029,6 +1039,7 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle)
for (int bar = startBar; bar != stopBar; bar += stepBar) {
float seriesPos = m_seriesStart;
for (int series = 0; series < seriesCount; series++) {
+ ObjectHelper *barObj = m_visibleSeriesList.at(series).object();
BarRenderItem &item = m_renderingArrays[series][row][bar];
if (item.height() < 0)
@@ -1094,6 +1105,7 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle)
}
item.setTranslation(translation);
item.setPosition(QPoint(row, bar));
+ item.setSeriesIndex(series);
m_sliceSelection->append(&item);
barSelectionFound = true;
}
@@ -1112,6 +1124,7 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle)
item.setTranslation(modelMatrix.column(3).toVector3D());
item.setPosition(QPoint(row, bar));
if (m_selectionDirty && bar < m_renderColumns) {
+ item.setSeriesIndex(series);
if (!m_sliceTitleItem && m_axisCacheX.labelItems().size() > row)
m_sliceTitleItem = m_axisCacheX.labelItems().at(row);
m_sliceSelection->append(&item);
@@ -1138,6 +1151,7 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle)
item.setTranslation(translation);
item.setPosition(QPoint(row, bar));
if (m_selectionDirty && row < m_renderRows) {
+ item.setSeriesIndex(series);
if (!m_sliceTitleItem && m_axisCacheZ.labelItems().size() > bar)
m_sliceTitleItem = m_axisCacheZ.labelItems().at(bar);
m_sliceSelection->append(&item);
@@ -1176,7 +1190,7 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle)
m_barShader->setUniformValue(m_barShader->lightS(), shadowLightStrength);
// Draw the object
- m_drawer->drawObject(m_barShader, m_barObj, gradientTexture, m_depthTexture);
+ m_drawer->drawObject(m_barShader, barObj, gradientTexture, m_depthTexture);
} else
#endif
{
@@ -1184,7 +1198,7 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle)
m_barShader->setUniformValue(m_barShader->lightS(), lightStrength);
// Draw the object
- m_drawer->drawObject(m_barShader, m_barObj, gradientTexture);
+ m_drawer->drawObject(m_barShader, barObj, gradientTexture);
}
}
seriesPos += m_seriesStep;
@@ -1829,16 +1843,6 @@ void Bars3DRenderer::updateAxisRange(Q3DAbstractAxis::AxisOrientation orientatio
}
}
-void Bars3DRenderer::updateTheme(Q3DTheme *theme)
-{
- bool wasEnabled = m_cachedTheme->isBackgroundEnabled();
-
- Abstract3DRenderer::updateTheme(theme);
-
- if (theme->isBackgroundEnabled() != wasEnabled)
- loadMeshFile(); // Load changed bar type
-}
-
void Bars3DRenderer::updateSelectedBar(const QPoint &position, const QBar3DSeries *series)
{
m_selectedBarPos = position;
@@ -1914,21 +1918,6 @@ void Bars3DRenderer::updateShadowQuality(QDataVis::ShadowQuality quality)
#endif
}
-void Bars3DRenderer::loadMeshFile()
-{
- if (m_cachedObjFile.isEmpty())
- return;
-
- QString objectFileName = m_cachedObjFile;
- if (m_barObj)
- delete m_barObj;
- // If background is disabled, load full version of bar mesh
- if (!m_cachedTheme->isBackgroundEnabled())
- objectFileName.append(QStringLiteral("Full"));
- m_barObj = new ObjectHelper(objectFileName);
- m_barObj->load();
-}
-
void Bars3DRenderer::loadBackgroundMesh()
{
if (m_backgroundObj)
@@ -1962,6 +1951,16 @@ void Bars3DRenderer::updateTextures()
m_updateLabels = true;
}
+void Bars3DRenderer::fixMeshFileName(QString &fileName, QAbstract3DSeries::Mesh mesh)
+{
+ if (!m_cachedTheme->isBackgroundEnabled()) {
+ // Load full version of meshes that have it available
+ // Note: Minimal and Point not supported in bar charts
+ if (mesh != QAbstract3DSeries::MeshSphere)
+ fileName.append(QStringLiteral("Full"));
+ }
+}
+
void Bars3DRenderer::calculateSceneScalingFactors()
{
// Calculate scene scaling and translation factors