summaryrefslogtreecommitdiffstats
path: root/src/datavis3d/engine/q3dbars.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/datavis3d/engine/q3dbars.cpp')
-rw-r--r--src/datavis3d/engine/q3dbars.cpp184
1 files changed, 159 insertions, 25 deletions
diff --git a/src/datavis3d/engine/q3dbars.cpp b/src/datavis3d/engine/q3dbars.cpp
index 9a72bd1a..e8372bd2 100644
--- a/src/datavis3d/engine/q3dbars.cpp
+++ b/src/datavis3d/engine/q3dbars.cpp
@@ -63,6 +63,7 @@
QTCOMMERCIALDATAVIS3D_BEGIN_NAMESPACE
#define USE_HAX0R_SELECTION // keep this defined until the "real" method works
+//#define USE_PAINTER_TEXT // Use QPainter labels or opengl labels
const float zComp = 10.0f; // Compensation for z position; move all objects to positive z, as shader can't handle negative values correctly
const QVector3D defaultLightPos = QVector3D(0.0f, 3.0f, zComp);
@@ -86,11 +87,14 @@ void Q3DBars::initialize()
d_ptr->initShaders(QStringLiteral(":/shaders/vertex")
, QStringLiteral(":/shaders/fragment"));
}
- // TODO: Texture test
- d_ptr->initBackgroundShaders(QStringLiteral(":/shaders/vertexTexture")
- , QStringLiteral(":/shaders/fragmentTexture"));
// d_ptr->initBackgroundShaders(QStringLiteral(":/shaders/vertexTexture")
// , QStringLiteral(":/shaders/fragmentTexture"));
+ d_ptr->initBackgroundShaders(QStringLiteral(":/shaders/vertex")
+ , QStringLiteral(":/shaders/fragment"));
+#ifndef USE_PAINTER_TEXT
+ d_ptr->initLabelShaders(QStringLiteral(":/shaders/vertexLabel")
+ , QStringLiteral(":/shaders/fragmentLabel"));
+#endif
d_ptr->initSelectionShader();
#ifndef USE_HAX0R_SELECTION
@@ -104,6 +108,11 @@ void Q3DBars::initialize()
// Load background mesh
d_ptr->loadBackgroundMesh();
+#ifndef USE_PAINTER_TEXT
+ // Load label mesh
+ d_ptr->loadLabelMesh();
+#endif
+
// Set OpenGL features
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
@@ -131,6 +140,7 @@ void Q3DBars::render()
if (!d_ptr->m_isInitialized)
return;
+#ifdef USE_PAINTER_TEXT
if (d_ptr->m_paintDevice) {
QPainter painter(d_ptr->m_paintDevice);
painter.setRenderHint(QPainter::HighQualityAntialiasing, true);
@@ -140,6 +150,17 @@ void Q3DBars::render()
} else {
d_ptr->m_paintDevice = getDevice();
}
+#else
+ // Set OpenGL features
+ glEnable(GL_DEPTH_TEST);
+ glDepthFunc(GL_LESS);
+ glEnable(GL_CULL_FACE);
+ glCullFace(GL_BACK);
+ // If zoom selection is on, draw zoom scene
+ drawZoomScene();
+ // Draw bars scene
+ drawScene();
+#endif
}
void Q3DBars::render(QPainter *painter)
@@ -422,6 +443,99 @@ void Q3DBars::drawZoomScene()
#endif
// Release bar shader
d_ptr->m_barShader->release();
+
+#ifndef USE_PAINTER_TEXT
+ // Draw labels (or values of bars)
+ const bool transparentLabel = false;
+ d_ptr->m_labelShader->bind();
+ glDisable(GL_DEPTH_TEST);
+ glEnable(GL_TEXTURE_2D);
+ if (transparentLabel) {
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ }
+ for (int col = 0; col < d_ptr->m_zoomSelection->d_ptr->row().size(); col++) {
+ // TODO: Optimize! Create textures only when zoomselection changes! Store the texture id's into zoomselection
+ QDataItem *item = d_ptr->m_zoomSelection->d_ptr->getItem(col);
+ // Create labels
+ // Print label into a QImage using QPainter
+ QImage label = Utils::printTextToImage(item->d_ptr->valueStr(), d_ptr->m_backgroundColor
+ , d_ptr->m_textColor, transparentLabel);
+
+ // Insert text texture into label
+ GLuint labelTexture = d_ptr->m_textureHelper->create2DTexture(label, false, false);
+
+ // Draw label
+ QMatrix4x4 modelMatrix;
+ QMatrix4x4 MVPMatrix;
+ if (ZoomColumn == d_ptr->m_selectionMode) {
+ modelMatrix.translate(-(item->d_ptr->translation().z()) - zComp
+ , -1.5f//item->d_ptr->translation().y()
+ , zComp);
+ } else {
+ modelMatrix.translate(item->d_ptr->translation().x()
+ , -1.5f//item->d_ptr->translation().y()
+ , zComp);
+ }
+
+ // Rotate
+ modelMatrix.rotate(-45.0f, 0.0f, 0.0f, 1.0f);
+
+ // TODO: Calculate uniform scaling from font height
+ // Scale label based on text size
+ modelMatrix.scale(QVector3D((float)label.width() / 450.0f
+ , (float)label.height() / 450.0f
+ , 0.0f));
+
+ MVPMatrix = projectionMatrix * viewMatrix * modelMatrix;
+
+ d_ptr->m_labelShader->setUniformValue(d_ptr->m_labelShader->MVP()
+ , MVPMatrix);
+
+ // Activate texture
+ glActiveTexture(GL_TEXTURE0);
+ glBindTexture(GL_TEXTURE_2D, labelTexture);
+ d_ptr->m_labelShader->setUniformValue(d_ptr->m_labelShader->texture()
+ , 0);
+
+ // 1st attribute buffer : vertices
+ glEnableVertexAttribArray(d_ptr->m_labelShader->posAtt());
+ glBindBuffer(GL_ARRAY_BUFFER, d_ptr->m_labelObj->vertexBuf());
+ glVertexAttribPointer(d_ptr->m_labelShader->posAtt()
+ , 3, GL_FLOAT, GL_FALSE, 0, (void*)0);
+
+ // 2nd attribute buffer : UVs
+ glEnableVertexAttribArray(d_ptr->m_labelShader->uvAtt());
+ glBindBuffer(GL_ARRAY_BUFFER, d_ptr->m_labelObj->uvBuf());
+ glVertexAttribPointer(d_ptr->m_labelShader->uvAtt()
+ , 2, GL_FLOAT, GL_FALSE, 0, (void*)0);
+
+ // Index buffer
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, d_ptr->m_labelObj->elementBuf());
+
+ // Draw the triangles
+ glDrawElements(GL_TRIANGLES, d_ptr->m_labelObj->indexCount()
+ , GL_UNSIGNED_SHORT, (void*)0);
+
+ // Free buffers
+ glBindBuffer(GL_ARRAY_BUFFER, 0);
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
+
+ glDisableVertexAttribArray(d_ptr->m_labelShader->uvAtt());
+ glDisableVertexAttribArray(d_ptr->m_labelShader->posAtt());
+
+ glBindTexture(GL_TEXTURE_2D, 0);
+ glDeleteTextures(1, &labelTexture);
+ }
+
+ glDisable(GL_TEXTURE_2D);
+ if (transparentLabel)
+ glDisable(GL_BLEND);
+ glEnable(GL_DEPTH_TEST);
+
+ // Release label shader
+ d_ptr->m_labelShader->release();
+#endif
}
void Q3DBars::drawScene()
@@ -627,9 +741,11 @@ void Q3DBars::drawScene()
// Bind background shader
d_ptr->m_backgroundShader->bind();
- // TODO: Texture test
- glEnable(GL_TEXTURE_2D);
- GLuint bgrTexture = TextureHelper::create2DTexture(QImage(QStringLiteral(":/textures/cubetex")));
+ // TODO: If we want to use background texture, we should create it in initBackground instead of here and keep the texture id in d_ptr
+ // Create texture
+ //glEnable(GL_TEXTURE_2D);
+ //GLuint bgrTexture = d_ptr->m_textureHelper->create2DTexture(
+ // QImage(QStringLiteral(":/textures/cubetex")), true);
// Draw background
if (d_ptr->m_backgroundObj) {
@@ -662,11 +778,11 @@ void Q3DBars::drawScene()
, d_ptr->m_lightStrength);
d_ptr->m_backgroundShader->setUniformValue(d_ptr->m_backgroundShader->ambientS()
, d_ptr->m_ambientStrength);
- // TODO: Texture test
- glActiveTexture(GL_TEXTURE0);
- glBindTexture(GL_TEXTURE_2D, bgrTexture);
- d_ptr->m_backgroundShader->setUniformValue(d_ptr->m_backgroundShader->texture()
- , 0);
+ // Activate texture
+ //glActiveTexture(GL_TEXTURE0);
+ //glBindTexture(GL_TEXTURE_2D, bgrTexture);
+ //d_ptr->m_backgroundShader->setUniformValue(d_ptr->m_backgroundShader->texture()
+ // , 0);
// 1st attribute buffer : vertices
glEnableVertexAttribArray(d_ptr->m_backgroundShader->posAtt());
@@ -680,12 +796,11 @@ void Q3DBars::drawScene()
glVertexAttribPointer(d_ptr->m_backgroundShader->normalAtt()
, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);
- // TODO: Texture test
// 3rd attribute buffer : UVs
- glEnableVertexAttribArray(d_ptr->m_backgroundShader->uvAtt());
- glBindBuffer(GL_ARRAY_BUFFER, d_ptr->m_backgroundObj->uvBuf());
- glVertexAttribPointer(d_ptr->m_backgroundShader->uvAtt()
- , 2, GL_FLOAT, GL_FALSE, 0, (void*)0);
+ //glEnableVertexAttribArray(d_ptr->m_backgroundShader->uvAtt());
+ //glBindBuffer(GL_ARRAY_BUFFER, d_ptr->m_backgroundObj->uvBuf());
+ //glVertexAttribPointer(d_ptr->m_backgroundShader->uvAtt()
+ // , 2, GL_FLOAT, GL_FALSE, 0, (void*)0);
// Index buffer
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, d_ptr->m_backgroundObj->elementBuf());
@@ -698,17 +813,15 @@ void Q3DBars::drawScene()
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
- // TODO: Texture test
- glDisableVertexAttribArray(d_ptr->m_backgroundShader->uvAtt());
-
+ //glDisableVertexAttribArray(d_ptr->m_backgroundShader->uvAtt());
glDisableVertexAttribArray(d_ptr->m_backgroundShader->normalAtt());
glDisableVertexAttribArray(d_ptr->m_backgroundShader->posAtt());
}
- // TODO: Texture test
- glBindTexture(GL_TEXTURE_2D, 0);
- glDeleteTextures(1, &bgrTexture);
- glDisable(GL_TEXTURE_2D);
+ // Disable textures
+ //glBindTexture(GL_TEXTURE_2D, 0);
+ //glDeleteTextures(1, &bgrTexture); // TODO: If we want to use background texture, we should create it in initBackground and delete on exit
+ //glDisable(GL_TEXTURE_2D);
// Release background shader
d_ptr->m_backgroundShader->release();
@@ -1456,8 +1569,10 @@ Q3DBarsPrivate::Q3DBarsPrivate(Q3DBars *q)
, m_barShader(0)
, m_selectionShader(0)
, m_backgroundShader(0)
+ , m_labelShader(0)
, m_barObj(0)
, m_backgroundObj(0)
+ , m_labelObj(0)
, m_sampleCount(QPoint(0, 0))
, m_objFile(QStringLiteral(":/defaultMeshes/bar"))
, m_mousePressed(MouseNone)
@@ -1502,6 +1617,7 @@ Q3DBarsPrivate::Q3DBarsPrivate(Q3DBars *q)
, m_sceneViewPort(0, 0, q->width(), q->height())
, m_zoomViewPort(0, 0, q->width(), q->height())
, m_zoomActivated(false)
+ , m_textureHelper(new TextureHelper())
{
}
@@ -1518,6 +1634,7 @@ Q3DBarsPrivate::~Q3DBarsPrivate()
delete m_backgroundShader;
delete m_barObj;
delete m_backgroundObj;
+ delete m_textureHelper;
#ifndef USE_HAX0R_SELECTION
q_ptr->glDeleteFramebuffers(1, &m_framebufferSelection);
@@ -1530,7 +1647,7 @@ void Q3DBarsPrivate::loadBarMesh()
{
if (m_barObj)
delete m_barObj;
- m_barObj = new ObjectHelper(q_ptr, m_objFile);
+ m_barObj = new ObjectHelper(m_objFile);
m_barObj->load();
}
@@ -1538,10 +1655,18 @@ void Q3DBarsPrivate::loadBackgroundMesh()
{
if (m_backgroundObj)
delete m_backgroundObj;
- m_backgroundObj = new ObjectHelper(q_ptr, QStringLiteral(":/defaultMeshes/background"));
+ m_backgroundObj = new ObjectHelper(QStringLiteral(":/defaultMeshes/background"));
m_backgroundObj->load();
}
+void Q3DBarsPrivate::loadLabelMesh()
+{
+ if (m_labelObj)
+ delete m_labelObj;
+ m_labelObj = new ObjectHelper(QStringLiteral(":/defaultMeshes/label"));
+ m_labelObj->load();
+}
+
void Q3DBarsPrivate::initShaders(const QString &vertexShader, const QString &fragmentShader)
{
if (m_barShader)
@@ -1605,6 +1730,15 @@ void Q3DBarsPrivate::initBackgroundShaders(const QString &vertexShader
m_backgroundShader->initialize();
}
+void Q3DBarsPrivate::initLabelShaders(const QString &vertexShader
+ , const QString &fragmentShader)
+{
+ if (m_labelShader)
+ delete m_labelShader;
+ m_labelShader = new ShaderHelper(q_ptr, vertexShader, fragmentShader);
+ m_labelShader->initialize();
+}
+
void Q3DBarsPrivate::calculateSceneScalingFactors()
{
// Calculate scene scaling and translation factors