summaryrefslogtreecommitdiffstats
path: root/src/datavis3d/engine/q3dmaps.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/datavis3d/engine/q3dmaps.cpp')
-rw-r--r--src/datavis3d/engine/q3dmaps.cpp1654
1 files changed, 74 insertions, 1580 deletions
diff --git a/src/datavis3d/engine/q3dmaps.cpp b/src/datavis3d/engine/q3dmaps.cpp
index 0a1ca7ff..ffa5ed1b 100644
--- a/src/datavis3d/engine/q3dmaps.cpp
+++ b/src/datavis3d/engine/q3dmaps.cpp
@@ -1,89 +1,30 @@
/****************************************************************************
**
-** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
-** Contact: http://www.qt-project.org/legal
+** Copyright (C) 2013 Digia Plc
+** All rights reserved.
+** For any questions to Digia, please use contact form at http://qt.digia.com
**
** This file is part of the QtDataVis3D module.
**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
+** Licensees holding valid Qt Enterprise licenses may use this file in
+** accordance with the Qt Enterprise License Agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and Digia. For licensing terms and
-** conditions see http://qt.digia.com/licensing. For further information
-** use the contact form at http://qt.digia.com/contact-us.
+** a written agreement between you and Digia.
**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Digia gives you certain additional
-** rights. These rights are described in the Digia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-**
-** $QT_END_LICENSE$
+** If you have questions regarding the use of this file, please use
+** contact form at http://qt.digia.com
**
****************************************************************************/
#include "q3dmaps.h"
#include "q3dmaps_p.h"
-#include "camerahelper_p.h"
-#include "qdataitem_p.h"
-#include "qdatarow_p.h"
-#include "qdataset_p.h"
-#include "shaderhelper_p.h"
-#include "objecthelper_p.h"
-#include "texturehelper_p.h"
-#include "theme_p.h"
-#include "utils_p.h"
-#include "drawer_p.h"
+#include "maps3dcontroller_p.h"
-#include <QOpenGLFunctions>
-#include <QMatrix4x4>
-#include <QOpenGLPaintDevice>
-#include <QPainter>
-#include <QScreen>
#include <QMouseEvent>
-#include <qmath.h>
-
#include <QDebug>
-//#define DISPLAY_RENDER_SPEED
-
-// Uncommenting this draws the shadow map with wider FOV than scene itself, making the light
-// seem to be closer to scene than it actually is. This way shadows look slightly better (to me anyway)
-#define USE_WIDER_SHADOWS
-
-// You can verify that depth buffer drawing works correctly by uncommenting this.
-// You should see the scene from where the light is
-//#define SHOW_DEPTH_TEXTURE_SCENE
-
-#ifdef DISPLAY_RENDER_SPEED
-#include <QTime>
-#endif
-
-QTENTERPRISE_DATAVIS3D_BEGIN_NAMESPACE
-
-//#define DISPLAY_FULL_DATA_ON_SELECTION // Append selection value text with row and column labels
-
-const GLfloat gridLineWidth = 0.005f;
-GLfloat distanceMod = 0.0f;
-static QVector3D skipColor = QVector3D(255, 255, 255); // Selection texture's background color
+QT_DATAVIS3D_BEGIN_NAMESPACE
/*!
* \class Q3DMaps
@@ -104,8 +45,9 @@ static QVector3D skipColor = QVector3D(255, 255, 255); // Selection texture's ba
* Constructs Q3DMaps.
*/
Q3DMaps::Q3DMaps()
- : d_ptr(new Q3DMapsPrivate(this))
+ : d_ptr(new Q3DMapsPrivate(this, geometry()))
{
+ d_ptr->m_shared->initializeOpenGL();
}
/*!
@@ -118,840 +60,9 @@ Q3DMaps::~Q3DMaps()
/*!
* \internal
*/
-void Q3DMaps::initialize()
-{
- // Initialize shaders
-#if !defined(QT_OPENGL_ES_2)
- if (d_ptr->m_shadowQuality > ShadowNone) {
- if (!d_ptr->m_theme->m_uniformColor) {
- d_ptr->initShaders(QStringLiteral(":/shaders/vertexShadow"),
- QStringLiteral(":/shaders/fragmentShadowNoTexColorOnY"));
- } else {
- d_ptr->initShaders(QStringLiteral(":/shaders/vertexShadow"),
- QStringLiteral(":/shaders/fragmentShadowNoTex"));
- }
- d_ptr->initBackgroundShaders(QStringLiteral(":/shaders/vertexShadow"),
- QStringLiteral(":/shaders/fragmentShadow"));
- // Init the depth buffer (for shadows)
- d_ptr->initDepthBuffer();
- } else {
- if (!d_ptr->m_theme->m_uniformColor) {
- d_ptr->initShaders(QStringLiteral(":/shaders/vertex"),
- QStringLiteral(":/shaders/fragmentColorOnY"));
- } else {
- d_ptr->initShaders(QStringLiteral(":/shaders/vertex"),
- QStringLiteral(":/shaders/fragment"));
- }
- d_ptr->initBackgroundShaders(QStringLiteral(":/shaders/vertexTexture"),
- QStringLiteral(":/shaders/fragmentTexture"));
- }
-#else
- if (!d_ptr->m_theme->m_uniformColor) {
- d_ptr->initShaders(QStringLiteral(":/shaders/vertexES2"),
- QStringLiteral(":/shaders/fragmentColorOnYES2"));
- } else {
- d_ptr->initShaders(QStringLiteral(":/shaders/vertexES2"),
- QStringLiteral(":/shaders/fragmentES2"));
- }
- d_ptr->initBackgroundShaders(QStringLiteral(":/shaders/vertexTexture"), // Same vertex shader ok for ES2
- QStringLiteral(":/shaders/fragmentTextureES2"));
-#endif
- d_ptr->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.
- d_ptr->initDepthShader();
-#endif
-
- // Init selection shader
- d_ptr->initSelectionShader();
-
- // Init the selection buffer
- d_ptr->initSelectionBuffer();
-
- // Load default mesh
- d_ptr->loadBarMesh();
-
- // Load background mesh
- d_ptr->loadBackgroundMesh();
-
- // Load grid line mesh
- d_ptr->loadGridLineMesh();
-
- // Load label mesh
- d_ptr->loadLabelMesh();
-
- // Set OpenGL features
- glEnable(GL_DEPTH_TEST);
- glDepthFunc(GL_LESS);
- glEnable(GL_CULL_FACE);
- glCullFace(GL_BACK);
-
-#if !defined(QT_OPENGL_ES_2)
- glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
- glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);
- glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST);
-#endif
-
- // Set initial camera position
- // X must be 0 for rotation to work - we can use "setCameraRotation" for setting it later
- CameraHelper::setDefaultCameraOrientation(QVector3D(0.0f, 0.0f, 1.0f + 2.9f * zComp),
- QVector3D(0.0f, 0.0f, zComp),
- QVector3D(0.0f, 1.0f, 0.0f));
-
- // Adjust to default rotation
- setCameraPosition(d_ptr->m_horizontalRotation, d_ptr->m_verticalRotation, d_ptr->m_zoomLevel);
-
- // Set view port
- glViewport(0, 0, width(), height());
-
- // Set initialized -flag
- d_ptr->m_isInitialized = true;
-
- d_ptr->m_drawer->initializeOpenGL();
-
- // Update default light position
-#ifndef USE_WIDER_SHADOWS
- distanceMod = 1.0f;
-#endif
-}
-
-/*!
- * \internal
- */
void Q3DMaps::render()
{
- if (!d_ptr->m_isInitialized)
- return;
-
-#ifdef DISPLAY_RENDER_SPEED
- // For speed computation
- static bool firstRender = true;
- static QTime lastTime;
- static GLint nbFrames = 0;
- if (firstRender) {
- lastTime.start();
- firstRender = false;
- }
-
- // Measure speed (as milliseconds per frame)
- nbFrames++;
- if (lastTime.elapsed() >= 1000) { // print only if last measurement was more than 1s ago
- qDebug() << qreal(lastTime.elapsed()) / qreal(nbFrames) << "ms/frame (=" << qreal(nbFrames) << "fps)";
- nbFrames = 0;
- lastTime.restart();
- }
-#endif
-
- // Draw scene
- drawScene();
-}
-
-/*!
- * \internal
- */
-void Q3DMaps::drawScene()
-{
- // Set clear color
- QVector3D clearColor = Utils::vectorFromColor(d_ptr->m_theme->m_windowColor);
- glClearColor(clearColor.x(), clearColor.y(), clearColor.z(), 1.0f);
-
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
- static QVector3D selection = skipColor;
-
- // Specify viewport
- glViewport(d_ptr->m_sceneViewPort.x(), d_ptr->m_sceneViewPort.y(),
- d_ptr->m_sceneViewPort.width(), d_ptr->m_sceneViewPort.height());
-
- // Set up projection matrix
- QMatrix4x4 projectionMatrix;
- projectionMatrix.perspective(45.0f, (GLfloat)d_ptr->m_sceneViewPort.width()
- / (GLfloat)d_ptr->m_sceneViewPort.height(), 0.1f, 100.0f);
-
- // Calculate view matrix
- QMatrix4x4 viewMatrix = CameraHelper::calculateViewMatrix(d_ptr->m_mousePos,
- d_ptr->m_zoomLevel
- * d_ptr->m_zoomAdjustment,
- d_ptr->m_sceneViewPort.width(),
- d_ptr->m_sceneViewPort.height());
-
- // Get light position (rotate light with camera, a bit above it (as set in defaultLightPos))
- QVector3D lightPos = CameraHelper::calculateLightPosition(defaultLightPos, 0.0f, distanceMod);
-
- // Map adjustment direction to model matrix scaling
- GLfloat heightMultiplier = 0.0f;
- GLfloat widthMultiplier = 0.0f;
- GLfloat depthMultiplier = 0.0f;
- GLfloat heightScaler = 0.0f;
- GLfloat widthScaler = 0.0f;
- GLfloat depthScaler = 0.0f;
- switch (d_ptr->m_adjustDirection) {
- case AdjustHeight:
- widthMultiplier = 0.0f;
- heightMultiplier = 1.0f;
- depthMultiplier = 0.0f;
- widthScaler = d_ptr->m_barThickness.x() / d_ptr->m_scaleFactor;
- heightScaler = 0.0f;
- depthScaler = d_ptr->m_barThickness.z() / d_ptr->m_scaleFactor;
- break;
- case AdjustWidth:
- widthMultiplier = 1.0f;
- heightMultiplier = 0.0f;
- depthMultiplier = 0.0f;
- widthScaler = 0.0f;
- heightScaler = d_ptr->m_barThickness.y() / d_ptr->m_scaleFactor;
- depthScaler = d_ptr->m_barThickness.z() / d_ptr->m_scaleFactor;
- break;
- case AdjustDepth:
- widthMultiplier = 0.0f;
- heightMultiplier = 0.0f;
- depthMultiplier = 1.0f;
- widthScaler = d_ptr->m_barThickness.x() / d_ptr->m_scaleFactor;
- heightScaler = d_ptr->m_barThickness.y() / d_ptr->m_scaleFactor;
- depthScaler = 0.0f;
- break;
- case AdjustRadius:
- widthMultiplier = 1.0f;
- heightMultiplier = 0.0f;
- depthMultiplier = 1.0f;
- widthScaler = 0.0f;
- heightScaler = d_ptr->m_barThickness.y() / d_ptr->m_scaleFactor;
- depthScaler = 0.0f;
- break;
- case AdjustAll:
- widthMultiplier = 1.0f;
- heightMultiplier = 1.0f;
- depthMultiplier = 1.0f;
- widthScaler = 0.0f;
- heightScaler = 0.0f;
- depthScaler = 0.0f;
- break;
- }
-
- // Introduce regardless of shadow quality to simplify logic
- QMatrix4x4 depthViewMatrix;
- QMatrix4x4 depthProjectionMatrix;
-
-#if !defined(QT_OPENGL_ES_2)
- if (d_ptr->m_shadowQuality > ShadowNone) {
- // Render scene into a depth texture for using with shadow mapping
- // Bind depth shader
- d_ptr->m_depthShader->bind();
-
- // Set viewport for depth map rendering. Must match texture size. Larger values give smoother shadows.
- glViewport(d_ptr->m_sceneViewPort.x(), d_ptr->m_sceneViewPort.y(),
- d_ptr->m_sceneViewPort.width() * d_ptr->m_shadowQuality,
- d_ptr->m_sceneViewPort.height() * d_ptr->m_shadowQuality);
-
- // Enable drawing to framebuffer
- glBindFramebuffer(GL_FRAMEBUFFER, d_ptr->m_depthFrameBuffer);
- glClear(GL_DEPTH_BUFFER_BIT);
-
- // Set front face culling to reduce self-shadowing issues
- glCullFace(GL_FRONT);
-
- // Get the depth view matrix
- // It may be possible to hack lightPos here if we want to make some tweaks to shadow
- depthViewMatrix.lookAt(lightPos, QVector3D(0.0f, -d_ptr->m_yAdjustment, zComp),
- QVector3D(0.0f, 1.0f, 0.0f));
- // TODO: Why does depthViewMatrix.column(3).y() goes to zero when we're directly above? That causes the scene to be not drawn from above -> must be fixed
- //qDebug() << lightPos << depthViewMatrix << depthViewMatrix.column(3);
- // Set the depth projection matrix
-#ifdef USE_WIDER_SHADOWS
- // Use this for a bit exaggerated shadows
- depthProjectionMatrix.perspective(60.0f, (GLfloat)d_ptr->m_sceneViewPort.width()
- / (GLfloat)d_ptr->m_sceneViewPort.height(), 3.0f, 100.0f);
-#else
- // Use these for normal shadows, with the light further away
- depthProjectionMatrix = projectionMatrix;
-#endif
-#if 0
- // Draw background to depth buffer (You don't want to do this, except maybe for debugging purposes)
- if (d_ptr->m_backgroundObj) {
- QMatrix4x4 modelMatrix;
- QMatrix4x4 MVPMatrix;
-
- modelMatrix.translate(0.0f, -d_ptr->m_yAdjustment, zComp);
- modelMatrix.scale(QVector3D(d_ptr->m_areaSize.width() / d_ptr->m_scaleFactor,
- 1.0f,
- d_ptr->m_areaSize.height() / d_ptr->m_scaleFactor));
- modelMatrix.rotate(-90.0f, 1.0f, 0.0f, 0.0f);
-
- MVPMatrix = depthProjectionMatrix * depthViewMatrix * modelMatrix;
-
- d_ptr->m_depthShader->setUniformValue(d_ptr->m_depthShader->MVP(), MVPMatrix);
-
- // 1st attribute buffer : vertices
- glEnableVertexAttribArray(d_ptr->m_depthShader->posAtt());
- glBindBuffer(GL_ARRAY_BUFFER, d_ptr->m_backgroundObj->vertexBuf());
- glVertexAttribPointer(d_ptr->m_depthShader->posAtt(), 3, GL_FLOAT, GL_FALSE, 0, (void *)0);
-
- // Index buffer
- glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, d_ptr->m_backgroundObj->elementBuf());
-
- // Draw the triangles
- glDrawElements(GL_TRIANGLES, d_ptr->m_backgroundObj->indexCount(), GL_UNSIGNED_SHORT,
- (void *)0);
-
- // Free buffers
- glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
- glBindBuffer(GL_ARRAY_BUFFER, 0);
-
- glDisableVertexAttribArray(d_ptr->m_depthShader->posAtt());
- }
-#endif
- // Draw bars to depth buffer
- for (int bar = 0; bar < d_ptr->m_data->d_ptr->row().size(); bar++) {
- QDataItem *item = d_ptr->m_data->d_ptr->getItem(bar);
- if (!item)
- continue;
-
- GLfloat barHeight = item->d_ptr->value() / d_ptr->m_heightNormalizer;
-
- QMatrix4x4 modelMatrix;
- QMatrix4x4 MVPMatrix;
-
- modelMatrix.translate(item->d_ptr->translation().x(),
- heightMultiplier * barHeight + heightScaler
- - d_ptr->m_yAdjustment,
- item->d_ptr->translation().z());
- modelMatrix.scale(QVector3D(widthMultiplier * barHeight + widthScaler,
- heightMultiplier * barHeight + heightScaler,
- depthMultiplier * barHeight + depthScaler));
-
- MVPMatrix = depthProjectionMatrix * depthViewMatrix * modelMatrix;
-
- d_ptr->m_depthShader->setUniformValue(d_ptr->m_depthShader->MVP(), MVPMatrix);
-
- // 1st attribute buffer : vertices
- glEnableVertexAttribArray(d_ptr->m_depthShader->posAtt());
- glBindBuffer(GL_ARRAY_BUFFER, d_ptr->m_barObj->vertexBuf());
- glVertexAttribPointer(d_ptr->m_depthShader->posAtt(), 3, GL_FLOAT, GL_FALSE, 0, (void *)0);
-
- // Index buffer
- glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, d_ptr->m_barObj->elementBuf());
-
- // Draw the triangles
- glDrawElements(GL_TRIANGLES, d_ptr->m_barObj->indexCount(), GL_UNSIGNED_SHORT, (void *)0);
-
- // Free buffers
- glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
- glBindBuffer(GL_ARRAY_BUFFER, 0);
-
- glDisableVertexAttribArray(d_ptr->m_depthShader->posAtt());
- }
-
- // Disable drawing to framebuffer (= enable drawing to screen)
- glBindFramebuffer(GL_FRAMEBUFFER, 0);
-
- // Reset culling to normal
- glCullFace(GL_BACK);
-
- // Release depth shader
- d_ptr->m_depthShader->release();
-
- // Revert to original viewport
- glViewport(d_ptr->m_sceneViewPort.x(), d_ptr->m_sceneViewPort.y(),
- d_ptr->m_sceneViewPort.width(), d_ptr->m_sceneViewPort.height());
-
-#if 0 // Use this if you want to see what is being drawn to the framebuffer
- // You'll also have to comment out GL_COMPARE_R_TO_TEXTURE -line in texturehelper (if using it)
- d_ptr->m_labelShader->bind();
- glEnable(GL_TEXTURE_2D);
- QMatrix4x4 modelMatrix;
- QMatrix4x4 viewmatrix;
- viewmatrix.lookAt(QVector3D(0.0f, 0.0f, 2.5f + zComp),
- QVector3D(0.0f, 0.0f, zComp),
- QVector3D(0.0f, 1.0f, 0.0f));
- modelMatrix.translate(0.0, 0.0, zComp);
- QMatrix4x4 MVPMatrix = projectionMatrix * viewmatrix * modelMatrix;
- d_ptr->m_labelShader->setUniformValue(d_ptr->m_labelShader->MVP(), MVPMatrix);
- d_ptr->m_drawer->drawObject(d_ptr->m_labelShader, d_ptr->m_labelObj,
- d_ptr->m_depthTexture);
- glDisable(GL_TEXTURE_2D);
- d_ptr->m_labelShader->release();
-#endif
- }
-#endif
-
-#if 1
- // Skip selection mode drawing if we're zoomed or have no selection mode
- if (!d_ptr->m_zoomActivated && d_ptr->m_selectionMode > ModeNone) {
- // Bind selection shader
- d_ptr->m_selectionShader->bind();
-
- // Draw bars to selection buffer
- glBindFramebuffer(GL_FRAMEBUFFER, d_ptr->m_selectionFrameBuffer);
- glEnable(GL_DEPTH_TEST); // Needed, otherwise the depth render buffer is not used
- glClearColor(skipColor.x() / 255, skipColor.y() / 255, skipColor.z() / 255, 1.0f); // Set clear color to white (= skipColor)
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Needed for clearing the frame buffer
- glDisable(GL_DITHER); // disable dithering, it may affect colors if enabled
- GLint barIdxRed = 0;
- GLint barIdxGreen = 0;
- GLint barIdxBlue = 0;
- for (int bar = 0; bar < d_ptr->m_data->d_ptr->row().size(); bar++, barIdxRed++) {
- QDataItem *item = d_ptr->m_data->d_ptr->getItem(bar);
- if (!item)
- continue;
-
- GLfloat barHeight = item->d_ptr->value() / d_ptr->m_heightNormalizer;
-
- QMatrix4x4 modelMatrix;
- QMatrix4x4 MVPMatrix;
-
- modelMatrix.translate(item->d_ptr->translation().x(),
- heightMultiplier * barHeight + heightScaler
- - d_ptr->m_yAdjustment,
- item->d_ptr->translation().z());
- modelMatrix.scale(QVector3D(widthMultiplier * barHeight + widthScaler,
- heightMultiplier * barHeight + heightScaler,
- depthMultiplier * barHeight + depthScaler));
-
- MVPMatrix = projectionMatrix * viewMatrix * modelMatrix;
-
- if (barIdxRed > 0 && barIdxRed % 256 == 0) {
- barIdxRed = 0;
- barIdxGreen++;
- }
- if (barIdxGreen > 0 && barIdxGreen % 256 == 0) {
- barIdxGreen = 0;
- barIdxBlue++;
- }
- if (barIdxBlue > 255)
- qFatal("Too many objects");
-
- QVector3D barColor = QVector3D((GLfloat)barIdxRed / 255.0f,
- (GLfloat)barIdxGreen / 255.0f,
- (GLfloat)barIdxBlue / 255.0f);
-
- d_ptr->m_selectionShader->setUniformValue(d_ptr->m_selectionShader->MVP(),
- MVPMatrix);
- d_ptr->m_selectionShader->setUniformValue(d_ptr->m_selectionShader->color(),
- barColor);
-
- // 1st attribute buffer : vertices
- glEnableVertexAttribArray(d_ptr->m_selectionShader->posAtt());
- glBindBuffer(GL_ARRAY_BUFFER, d_ptr->m_barObj->vertexBuf());
- glVertexAttribPointer(d_ptr->m_selectionShader->posAtt(),
- 3, GL_FLOAT, GL_FALSE, 0, (void *)0);
-
- // Index buffer
- glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, d_ptr->m_barObj->elementBuf());
-
- // Draw the triangles
- glDrawElements(GL_TRIANGLES, d_ptr->m_barObj->indexCount(), GL_UNSIGNED_SHORT,
- (void *)0);
-
- // Free buffers
- glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
- glBindBuffer(GL_ARRAY_BUFFER, 0);
-
- glDisableVertexAttribArray(d_ptr->m_selectionShader->posAtt());
- }
- glEnable(GL_DITHER);
-
- // Read color under cursor
- if (Q3DMapsPrivate::MouseOnScene == d_ptr->m_mousePressed)
- selection = Utils::getSelection(d_ptr->m_mousePos, height());
-
- glBindFramebuffer(GL_FRAMEBUFFER, 0);
-
- // Release selection shader
- d_ptr->m_selectionShader->release();
-
-#if 0 // Use this if you want to see what is being drawn to the framebuffer
- d_ptr->m_labelShader->bind();
- glDisable(GL_DEPTH_TEST);
- glEnable(GL_TEXTURE_2D);
- QMatrix4x4 modelMatrix;
- QMatrix4x4 viewmatrix;
- viewmatrix.lookAt(QVector3D(0.0f, 0.0f, 2.0f + zComp),
- QVector3D(0.0f, 0.0f, zComp),
- QVector3D(0.0f, 1.0f, 0.0f));
- modelMatrix.translate(0.0, 0.0, zComp);
- QMatrix4x4 MVPMatrix = projectionMatrix * viewmatrix * modelMatrix;
- d_ptr->m_labelShader->setUniformValue(d_ptr->m_labelShader->MVP(), MVPMatrix);
- d_ptr->m_drawer->drawObject(d_ptr->m_labelShader, d_ptr->m_labelObj,
- d_ptr->m_selectionTexture);
- glDisable(GL_TEXTURE_2D);
- d_ptr->m_labelShader->release();
-#endif
- }
-#if 1
- // Bind bar shader
- d_ptr->m_barShader->bind();
-
- // Enable texture
- glEnable(GL_TEXTURE_2D);
-
- // Draw bars
- // TODO: Handle zoom by camera transformations
- //if (!d_ptr->m_zoomActivated)
-
- bool barSelectionFound = false;
- for (int bar = 0; bar < d_ptr->m_data->d_ptr->row().size(); bar++) {
- QDataItem *item = d_ptr->m_data->d_ptr->getItem(bar);
- if (!item)
- continue;
-
- GLfloat barHeight = item->d_ptr->value() / d_ptr->m_heightNormalizer;
-
- QMatrix4x4 modelMatrix;
- QMatrix4x4 MVPMatrix;
- QMatrix4x4 depthMVPMatrix;
- QMatrix4x4 itModelMatrix;
-
- modelMatrix.translate(item->d_ptr->translation().x(),
- heightMultiplier * barHeight + heightScaler - d_ptr->m_yAdjustment,
- item->d_ptr->translation().z());
- modelMatrix.scale(QVector3D(widthMultiplier * barHeight + widthScaler,
- heightMultiplier * barHeight + heightScaler,
- depthMultiplier * barHeight + depthScaler));
- itModelMatrix.scale(QVector3D(widthMultiplier * barHeight + widthScaler,
- heightMultiplier * barHeight + heightScaler,
- depthMultiplier * barHeight + depthScaler));
-
-#ifdef SHOW_DEPTH_TEXTURE_SCENE
- MVPMatrix = depthProjectionMatrix * depthViewMatrix * modelMatrix;
-#else
- MVPMatrix = projectionMatrix * viewMatrix * modelMatrix;
-#endif
- depthMVPMatrix = depthProjectionMatrix * depthViewMatrix * modelMatrix;
-
- QVector3D baseColor = Utils::vectorFromColor(d_ptr->m_theme->m_baseColor);
- QVector3D heightColor = Utils::vectorFromColor(d_ptr->m_theme->m_heightColor)
- * barHeight;
-
- QVector3D barColor = baseColor + heightColor;
-
- GLfloat lightStrength = d_ptr->m_theme->m_lightStrength;
- if (d_ptr->m_selectionMode > ModeNone) {
- Q3DMapsPrivate::SelectionType selectionType = d_ptr->isSelected(bar, selection);
- switch (selectionType) {
- case Q3DMapsPrivate::SelectionBar: {
- barColor = Utils::vectorFromColor(d_ptr->m_theme->m_highlightBarColor);
- lightStrength = d_ptr->m_theme->m_highlightLightStrength;
- // Insert data to QDataItem. We have no ownership, don't delete the previous one
- if (!d_ptr->m_zoomActivated) {
- d_ptr->m_selectedBar = item;
- barSelectionFound = true;
- }
- break;
- }
- case Q3DMapsPrivate::SelectionNone: {
- // Current bar is not selected, nor on a row or column
- // do nothing
- break;
- }
- default: {
- // Unsupported selection mode
- // do nothing
- break;
- }
- }
- }
-
- if (barHeight != 0) {
- // Set shader bindings
- d_ptr->m_barShader->setUniformValue(d_ptr->m_barShader->lightP(), lightPos);
- d_ptr->m_barShader->setUniformValue(d_ptr->m_barShader->view(), viewMatrix);
- d_ptr->m_barShader->setUniformValue(d_ptr->m_barShader->model(), modelMatrix);
- d_ptr->m_barShader->setUniformValue(d_ptr->m_barShader->nModel(),
- itModelMatrix.inverted().transposed());
- d_ptr->m_barShader->setUniformValue(d_ptr->m_barShader->MVP(), MVPMatrix);
- d_ptr->m_barShader->setUniformValue(d_ptr->m_barShader->color(), barColor);
- d_ptr->m_barShader->setUniformValue(d_ptr->m_barShader->ambientS(),
- d_ptr->m_theme->m_ambientStrength);
-
-#if !defined(QT_OPENGL_ES_2)
- if (d_ptr->m_shadowQuality > ShadowNone) {
- // Set shadow shader bindings
- d_ptr->m_barShader->setUniformValue(d_ptr->m_barShader->shadowQ(),
- d_ptr->m_shadowQualityToShader);
- d_ptr->m_barShader->setUniformValue(d_ptr->m_barShader->depth(),
- depthMVPMatrix);
- d_ptr->m_barShader->setUniformValue(d_ptr->m_barShader->lightS(),
- lightStrength / 10.0f);
-
- // Draw the object
- d_ptr->m_drawer->drawObject(d_ptr->m_barShader, d_ptr->m_barObj,
- 0, d_ptr->m_depthTexture);
- } else
-#endif
- {
- // Set shadowless shader bindings
- d_ptr->m_barShader->setUniformValue(d_ptr->m_barShader->lightS(), lightStrength);
-
- // Draw the object
- d_ptr->m_drawer->drawObject(d_ptr->m_barShader, d_ptr->m_barObj);
- }
- }
- }
-
- // Release bar shader
- d_ptr->m_barShader->release();
-#if 1
- // Bind background shader
- d_ptr->m_backgroundShader->bind();
- if (d_ptr->m_bgrHasAlpha) {
- glEnable(GL_BLEND);
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- }
-
- // Draw background
- if (d_ptr->m_backgroundObj) {
- QMatrix4x4 modelMatrix;
- QMatrix4x4 MVPMatrix;
- QMatrix4x4 depthMVPMatrix;
- QMatrix4x4 itModelMatrix;
-
- modelMatrix.translate(0.0f, -d_ptr->m_yAdjustment, zComp);
- modelMatrix.scale(QVector3D(d_ptr->m_areaSize.width() / d_ptr->m_scaleFactor,
- 1.0f,
- d_ptr->m_areaSize.height() / d_ptr->m_scaleFactor));
- modelMatrix.rotate(-90.0f, 1.0f, 0.0f, 0.0f);
- itModelMatrix.scale(QVector3D(d_ptr->m_areaSize.width() / d_ptr->m_scaleFactor,
- 1.0f,
- d_ptr->m_areaSize.height() / d_ptr->m_scaleFactor));
-
-#ifdef SHOW_DEPTH_TEXTURE_SCENE
- MVPMatrix = depthProjectionMatrix * depthViewMatrix * modelMatrix;
-#else
- MVPMatrix = projectionMatrix * viewMatrix * modelMatrix;
-#endif
- depthMVPMatrix = depthProjectionMatrix * depthViewMatrix * modelMatrix;
-
- // Set shader bindings
- d_ptr->m_backgroundShader->setUniformValue(d_ptr->m_backgroundShader->lightP(), lightPos);
- d_ptr->m_backgroundShader->setUniformValue(d_ptr->m_backgroundShader->view(), viewMatrix);
- d_ptr->m_backgroundShader->setUniformValue(d_ptr->m_backgroundShader->model(), modelMatrix);
- d_ptr->m_backgroundShader->setUniformValue(d_ptr->m_backgroundShader->nModel(),
- itModelMatrix.inverted().transposed());
- d_ptr->m_backgroundShader->setUniformValue(d_ptr->m_backgroundShader->MVP(), MVPMatrix);
- d_ptr->m_backgroundShader->setUniformValue(d_ptr->m_backgroundShader->ambientS(),
- d_ptr->m_theme->m_ambientStrength * 3.0f);
-
-#if !defined(QT_OPENGL_ES_2)
- if (d_ptr->m_shadowQuality > ShadowNone) {
- // Set shadow shader bindings
- d_ptr->m_backgroundShader->setUniformValue(d_ptr->m_backgroundShader->shadowQ(),
- d_ptr->m_shadowQualityToShader);
- d_ptr->m_backgroundShader->setUniformValue(d_ptr->m_backgroundShader->depth(),
- depthMVPMatrix);
- d_ptr->m_backgroundShader->setUniformValue(d_ptr->m_backgroundShader->lightS(),
- d_ptr->m_theme->m_lightStrength / 25.0f);
-
- // Draw the object
- d_ptr->m_drawer->drawObject(d_ptr->m_backgroundShader, d_ptr->m_backgroundObj,
- d_ptr->m_bgrTexture, d_ptr->m_depthTexture);
- } else
-#endif
- {
- // Set shadowless shader bindings
- d_ptr->m_backgroundShader->setUniformValue(d_ptr->m_backgroundShader->lightS(),
- d_ptr->m_theme->m_lightStrength);
-
- // Draw the object
- d_ptr->m_drawer->drawObject(d_ptr->m_backgroundShader, d_ptr->m_backgroundObj,
- d_ptr->m_bgrTexture);
- }
- }
-
- // Disable textures
- glDisable(GL_TEXTURE_2D);
- if (d_ptr->m_bgrHasAlpha)
- glDisable(GL_BLEND);
-
- // Release background shader
- d_ptr->m_backgroundShader->release();
-#endif
-
- // Handle zoom activation and label drawing
- if (!barSelectionFound) {
- // We have no ownership, don't delete. Just NULL the pointer.
- d_ptr->m_selectedBar = NULL;
- //if (d_ptr->m_zoomActivated && Q3DMapsPrivate::MouseOnOverview == d_ptr->m_mousePressed) {
- //d_ptr->m_sceneViewPort = QRect(0, 0, width(), height());
- //d_ptr->m_zoomActivated = false;
- //}
- } /*else if (d_ptr->m_selectionMode >= ModeZoomRow
- && Q3DMapsPrivate::MouseOnScene == d_ptr->m_mousePressed) {
- // Activate zoom mode
- d_ptr->m_zoomActivated = true;
- d_ptr->m_sceneViewPort = QRect(0, height() - height() / 5, width() / 5, height() / 5);
-
- // Create label textures
- for (int col = 0; col < d_ptr->m_zoomSelection->d_ptr->row().size(); col++) {
- QDataItem *item = d_ptr->m_zoomSelection->d_ptr->getItem(col);
- d_ptr->m_drawer->generateLabelTexture(item);
- }
- }*/ else {
- // Print value of selected bar
- static QDataItem *prevItem = d_ptr->m_selectedBar;
- d_ptr->m_labelShader->bind();
- glDisable(GL_DEPTH_TEST);
- glEnable(GL_TEXTURE_2D);
- if (d_ptr->m_labelTransparency > TransparencyNone) {
- glEnable(GL_BLEND);
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- }
-#ifndef DISPLAY_FULL_DATA_ON_SELECTION
- // Draw just the value string of the selected bar
- if (prevItem != d_ptr->m_selectedBar || d_ptr->m_updateLabels) {
- d_ptr->m_drawer->generateLabelTexture(d_ptr->m_selectedBar);
- prevItem = d_ptr->m_selectedBar;
- }
-
- d_ptr->m_drawer->drawLabel(*d_ptr->m_selectedBar, d_ptr->m_selectedBar->d_ptr->label(),
- viewMatrix, projectionMatrix,
- QVector3D(0.0f, d_ptr->m_yAdjustment, zComp),
- QVector3D(0.0f, 0.0f, 0.0f), d_ptr->m_heightNormalizer,
- d_ptr->m_selectionMode, d_ptr->m_labelShader,
- d_ptr->m_labelObj, true);
-#else
- static bool firstSelection = true;
- // Draw the value string followed by row label and column label
- LabelItem labelItem = d_ptr->m_selectedBar->d_ptr->selectionLabel();
- if (firstSelection || prevItem != d_ptr->m_selectedBar || d_ptr->m_updateLabels) {
- QString labelText = d_ptr->m_selectedBar->d_ptr->valueStr();
- // if ((d_ptr->m_data->d_ptr->columnLabels().size()
- // > d_ptr->m_selectedBar->d_ptr->position().y())
- // && (d_ptr->m_data->d_ptr->rowLabels().size()
- // > d_ptr->m_selectedBar->d_ptr->position().x())) {
- // labelText.append(QStringLiteral(" ("));
- // labelText.append(d_ptr->m_data->d_ptr->rowLabels().at(
- // d_ptr->m_selectedBar->d_ptr->position().x()));
- // labelText.append(QStringLiteral(", "));
- // labelText.append(d_ptr->m_data->d_ptr->columnLabels().at(
- // d_ptr->m_selectedBar->d_ptr->position().y()));
- // labelText.append(QStringLiteral(")"));
- // //qDebug() << labelText;
- // }
- d_ptr->m_drawer->generateLabelItem(&labelItem, labelText);
- d_ptr->m_selectedBar->d_ptr->setSelectionLabel(labelItem);
- prevItem = d_ptr->m_selectedBar;
- firstSelection = false;
- }
-
- d_ptr->m_drawer->drawLabel(*d_ptr->m_selectedBar, labelItem, viewMatrix, projectionMatrix,
- QVector3D(0.0f, d_ptr->m_yAdjustment, zComp),
- QVector3D(0.0f, 0.0f, 0.0f), d_ptr->m_heightNormalizer,
- d_ptr->m_selectionMode, d_ptr->m_labelShader,
- d_ptr->m_labelObj, true, false);
-#endif
- glDisable(GL_TEXTURE_2D);
- if (d_ptr->m_labelTransparency > TransparencyNone)
- glDisable(GL_BLEND);
- glEnable(GL_DEPTH_TEST);
-
- // Release label shader
- d_ptr->m_labelShader->release();
-
- // Reset label update flag; they should have been updated when we get here
- d_ptr->m_updateLabels = false;
- }
-#if 0
- // TODO: Calculations done temporarily here. When optimizing, move to after data set addition? Keep drawing of the labels here.
- // Bind label shader
- d_ptr->m_labelShader->bind();
-
- glEnable(GL_TEXTURE_2D);
- if (d_ptr->m_labelTransparency > TransparencyNone) {
- glEnable(GL_BLEND);
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- }
-
- // Calculate the positions for row and column labels and store them into QDataItems (and QDataRows?)
- for (int row = 0; row != d_ptr->m_sampleCount.second; row += 1) {
- // Go through all rows and get position of max+1 or min-1 column, depending on x flip
- // We need only positions for them, labels have already been generated at QDataSet. Just add LabelItems
- rowPos = (row + 1) * (d_ptr->m_barSpacing.height());
- barPos = 0;
- GLfloat rotLabelX = -90.0f;
- GLfloat rotLabelY = 0.0f;
- Qt::AlignmentFlag alignment = Qt::AlignRight;
- if (d_ptr->m_zFlipped)
- rotLabelY = 180.0f;
- if (d_ptr->m_xFlipped) {
- barPos = (d_ptr->m_sampleCount.first + 1) * (d_ptr->m_barSpacing.width());
- alignment = Qt::AlignLeft;
- }
- QVector3D labelPos = QVector3D((d_ptr->m_rowWidth - barPos) / d_ptr->m_scaleFactor,
- -d_ptr->m_yAdjustment + 0.005f, // raise a bit over background to avoid depth "glimmering"
- (d_ptr->m_columnDepth - rowPos) / d_ptr->m_scaleFactor
- + zComp);
-
- // TODO: Try it; draw the label here
-
- // Create a data item
- QDataItem *label = new QDataItem();
- label->d_ptr->setTranslation(labelPos);
- if (d_ptr->m_data->d_ptr->rowLabelItems().size() > row) {
- label->d_ptr->setLabel(d_ptr->m_data->d_ptr->rowLabelItems().at(
- d_ptr->m_data->d_ptr->rowLabelItems().size() - row - 1));
- }
-
- //qDebug() << "labelPos, row" << row + 1 << ":" << labelPos << d_ptr->m_dataSet->d_ptr->rowLabels().at(row);
-
- d_ptr->m_drawer->drawLabel(*label, label->d_ptr->label(), viewMatrix, projectionMatrix,
- QVector3D(0.0f, d_ptr->m_yAdjustment, zComp),
- QVector3D(rotLabelX, rotLabelY, 0.0f), d_ptr->m_heightNormalizer,
- d_ptr->m_selectionMode, d_ptr->m_labelShader,
- d_ptr->m_labelObj, true, true, LabelMid, alignment);
-
- delete label;
- }
- for (int bar = 0; bar != d_ptr->m_sampleCount.first; bar += 1) {
- // Go through all columns and get position of max+1 or min-1 row, depending on z flip
- // We need only positions for them, labels have already been generated at QDataSet. Just add LabelItems
- barPos = (bar + 1) * (d_ptr->m_barSpacing.width());
- rowPos = 0;
- GLfloat rotLabelX = -90.0f;
- GLfloat rotLabelY = 90.0f;
- Qt::AlignmentFlag alignment = Qt::AlignLeft;
- if (d_ptr->m_xFlipped)
- rotLabelY = -90.0f;
- if (d_ptr->m_zFlipped) {
- rowPos = (d_ptr->m_sampleCount.second + 1) * (d_ptr->m_barSpacing.height());
- alignment = Qt::AlignRight;
- }
- QVector3D labelPos = QVector3D((d_ptr->m_rowWidth - barPos) / d_ptr->m_scaleFactor,
- -d_ptr->m_yAdjustment + 0.005f, // raise a bit over background to avoid depth "glimmering"
- (d_ptr->m_columnDepth - rowPos) / d_ptr->m_scaleFactor
- + zComp);
-
- // TODO: Try it; draw the label here
-
- // Create a data item
- QDataItem *label = new QDataItem();
- label->d_ptr->setTranslation(labelPos);
- if (d_ptr->m_data->d_ptr->columnLabelItems().size() > bar) {
- label->d_ptr->setLabel(d_ptr->m_data->d_ptr->columnLabelItems().at(
- d_ptr->m_data->d_ptr->columnLabelItems().size()
- - bar - 1));
- }
-
- //qDebug() << "labelPos, col" << bar + 1 << ":" << labelPos << d_ptr->m_dataSet->d_ptr->columnLabels().at(bar);
-
- d_ptr->m_drawer->drawLabel(*label, label->d_ptr->label(), viewMatrix, projectionMatrix,
- QVector3D(0.0f, d_ptr->m_yAdjustment, zComp),
- QVector3D(rotLabelX, rotLabelY, 0.0f), d_ptr->m_heightNormalizer,
- d_ptr->m_selectionMode, d_ptr->m_labelShader,
- d_ptr->m_labelObj, true, true, LabelMid, alignment);
-
- delete label;
- }
- glDisable(GL_TEXTURE_2D);
- if (d_ptr->m_labelTransparency > TransparencyNone)
- glDisable(GL_BLEND);
-
- // Release label shader
- d_ptr->m_labelShader->release();
-#endif
-#endif
-#endif
+ d_ptr->m_shared->render();
}
#if defined(Q_OS_ANDROID)
@@ -960,11 +71,7 @@ void Q3DMaps::drawScene()
*/
void Q3DMaps::mouseDoubleClickEvent(QMouseEvent *event)
{
- if (!d_ptr->m_zoomActivated) {
- d_ptr->m_mousePressed = Q3DMapsPrivate::MouseOnScene;
- // update mouse positions to prevent jumping when releasing or repressing a button
- d_ptr->m_mousePos = event->pos();
- }
+ d_ptr->m_shared->mouseDoubleClickEvent(event);
}
/*!
@@ -972,30 +79,7 @@ void Q3DMaps::mouseDoubleClickEvent(QMouseEvent *event)
*/
void Q3DMaps::touchEvent(QTouchEvent *event)
{
- static int prevDistance = 0;
-
- QList<QTouchEvent::TouchPoint> points;
- points = event->touchPoints();
-
- if (points.count() == 2) {
- d_ptr->m_mousePressed = Q3DMapsPrivate::MouseOnPinch;
-
- QPointF distance = points.at(0).pos() - points.at(1).pos();
- int newDistance = distance.manhattanLength();
- int zoomRate = 1;
- if (d_ptr->m_zoomLevel > 100)
- zoomRate = 5;
- if (newDistance > prevDistance)
- d_ptr->m_zoomLevel += zoomRate;
- else
- d_ptr->m_zoomLevel -= zoomRate;
- if (d_ptr->m_zoomLevel > 500)
- d_ptr->m_zoomLevel = 500;
- else if (d_ptr->m_zoomLevel < 10)
- d_ptr->m_zoomLevel = 10;
- prevDistance = newDistance;
- //qDebug() << "distance" << distance.manhattanLength();
- }
+ d_ptr->m_shared->touchEvent(event);
}
#endif
@@ -1004,40 +88,7 @@ void Q3DMaps::touchEvent(QTouchEvent *event)
*/
void Q3DMaps::mousePressEvent(QMouseEvent *event)
{
- if (Qt::LeftButton == event->button()) {
- if (d_ptr->m_zoomActivated) {
- //qDebug() << event->pos().x() << event->pos().y() << d_ptr->m_sceneViewPort << d_ptr->m_zoomViewPort;
- if (event->pos().x() <= d_ptr->m_sceneViewPort.width()
- && event->pos().y() <= d_ptr->m_sceneViewPort.height()) {
- d_ptr->m_mousePressed = Q3DMapsPrivate::MouseOnOverview;
- //qDebug() << "Mouse pressed on overview";
- } else {
- d_ptr->m_mousePressed = Q3DMapsPrivate::MouseOnZoom;
- //qDebug() << "Mouse pressed on zoom";
- }
- } else {
-#if !defined(Q_OS_ANDROID)
- d_ptr->m_mousePressed = Q3DMapsPrivate::MouseOnScene;
-#else
- d_ptr->m_mousePressed = Q3DMapsPrivate::MouseRotating;
-#endif
- // update mouse positions to prevent jumping when releasing or repressing a button
- d_ptr->m_mousePos = event->pos();
- //qDebug() << "Mouse pressed on scene";
- }
- } else if (Qt::MiddleButton == event->button()) {
- // reset rotations
- d_ptr->m_mousePos = QPoint(0, 0);
- } else if (Qt::RightButton == event->button()) {
-#if !defined(Q_OS_ANDROID)
- d_ptr->m_mousePressed = Q3DMapsPrivate::MouseRotating;
-#else
- d_ptr->m_mousePressed = Q3DMapsPrivate::MouseOnScene;
-#endif
- // update mouse positions to prevent jumping when releasing or repressing a button
- d_ptr->m_mousePos = event->pos();
- }
- CameraHelper::updateMousePos(d_ptr->m_mousePos);
+ d_ptr->m_shared->mousePressEvent(event, event->pos());
}
/*!
@@ -1045,13 +96,7 @@ void Q3DMaps::mousePressEvent(QMouseEvent *event)
*/
void Q3DMaps::mouseReleaseEvent(QMouseEvent *event)
{
- //qDebug() << "mouse button released" << event->button();
- if (Q3DMapsPrivate::MouseRotating == d_ptr->m_mousePressed) {
- // update mouse positions to prevent jumping when releasing or repressing a button
- d_ptr->m_mousePos = event->pos();
- CameraHelper::updateMousePos(event->pos());
- }
- d_ptr->m_mousePressed = Q3DMapsPrivate::MouseNone;
+ d_ptr->m_shared->mouseReleaseEvent(event, event->pos());
}
/*!
@@ -1059,25 +104,7 @@ void Q3DMaps::mouseReleaseEvent(QMouseEvent *event)
*/
void Q3DMaps::mouseMoveEvent(QMouseEvent *event)
{
- if (Q3DMapsPrivate::MouseRotating == d_ptr->m_mousePressed) {
- //qDebug() << "mouse moved while pressed" << event->pos();
- d_ptr->m_mousePos = event->pos();
- }
-#if 0
- // TODO: Testi - laske kursorin sijainti scenessä
- QPointF mouse3D((2.0f * event->pos().x() - width()) / height(),
- 1.0f - (2.0f * event->pos().y()) / height());
- //qDebug() << "mouse position in scene" << mouse3D;
-
- // TODO: Testi laske focal point
- GLfloat focalPoint = tan(45.0f / 2.0f);
-
- // TODO: Testi - laske viewmatriisin kerroin
- QVector3D worldRay = QVector3D(0.0f, 0.0f, 0.0f)
- - QVector3D(mouse3D.x(), mouse3D.y(), -focalPoint);
- //qDebug() << "worldRay" << worldRay;
- // multiply viewmatrix with this to get something?
-#endif
+ d_ptr->m_shared->mouseMoveEvent(event, event->pos());
}
/*!
@@ -1085,16 +112,7 @@ void Q3DMaps::mouseMoveEvent(QMouseEvent *event)
*/
void Q3DMaps::wheelEvent(QWheelEvent *event)
{
- if (d_ptr->m_zoomLevel > 100)
- d_ptr->m_zoomLevel += event->angleDelta().y() / 12;
- else if (d_ptr->m_zoomLevel > 50)
- d_ptr->m_zoomLevel += event->angleDelta().y() / 60;
- else
- d_ptr->m_zoomLevel += event->angleDelta().y() / 120;
- if (d_ptr->m_zoomLevel > 500)
- d_ptr->m_zoomLevel = 500;
- else if (d_ptr->m_zoomLevel < 10)
- d_ptr->m_zoomLevel = 10;
+ d_ptr->m_shared->wheelEvent(event);
}
/*!
@@ -1103,195 +121,78 @@ void Q3DMaps::wheelEvent(QWheelEvent *event)
void Q3DMaps::resizeEvent(QResizeEvent *event)
{
Q_UNUSED(event);
+ d_ptr->m_shared->setWidth(width());
+ d_ptr->m_shared->setHeight(height());
+ d_ptr->m_shared->resizeNotify();
+}
- // Set view port
- if (d_ptr->m_zoomActivated)
- d_ptr->m_sceneViewPort = QRect(0, height() - height() / 5, width() / 5, height() / 5);
- else
- d_ptr->m_sceneViewPort = QRect(0, 0, width(), height());
- d_ptr->m_zoomViewPort = QRect(0, 0, width(), height());
-
- // Calculate zoom level based on aspect ratio
- GLfloat div;
- GLfloat zoomAdjustment;
- div = qMin(width(), height());
- zoomAdjustment = defaultRatio * ((width() / div) / (height() / div));
- //qDebug() << "zoom adjustment" << zoomAdjustment;
- d_ptr->m_zoomAdjustment = qMin(zoomAdjustment, 1.0f); // clamp to 1.0f
-
- // Re-init selection buffer
- d_ptr->initSelectionBuffer();
+// TODO: Document
+// Size
+void Q3DMaps::setWidth(const int width)
+{
+ d_ptr->m_shared->setWidth(width);
+ QWindow::setWidth(width);
+}
-#if !defined(QT_OPENGL_ES_2)
- // Re-init depth buffer
- if (d_ptr->m_isInitialized && d_ptr->m_shadowQuality > ShadowNone)
- d_ptr->initDepthBuffer();
-#endif
+void Q3DMaps::setHeight(const int height)
+{
+ d_ptr->m_shared->setHeight(height);
+ QWindow::setHeight(height);
}
void Q3DMaps::setBarSpecs(const QVector3D &thickness, AdjustmentDirection direction)
{
- d_ptr->m_barThickness = thickness;
- d_ptr->m_adjustDirection = direction;
+ d_ptr->m_shared->setBarSpecs(thickness, direction);
}
-void Q3DMaps::setBarType(BarStyle style, bool smooth)
+void Q3DMaps::setBarType(QDataVis::MeshStyle style, bool smooth)
{
- if (style == Bars) {
- if (smooth)
- d_ptr->m_objFile = QStringLiteral(":/defaultMeshes/barSmooth");
- else
- d_ptr->m_objFile = QStringLiteral(":/defaultMeshes/bar");
- } else if (style == Pyramids) {
- if (smooth)
- d_ptr->m_objFile = QStringLiteral(":/defaultMeshes/pyramidSmooth");
- else
- d_ptr->m_objFile = QStringLiteral(":/defaultMeshes/pyramid");
- } else if (style == Cones) {
- if (smooth)
- d_ptr->m_objFile = QStringLiteral(":/defaultMeshes/coneSmooth");
- else
- d_ptr->m_objFile = QStringLiteral(":/defaultMeshes/cone");
- } else if (style == Cylinders) {
- if (smooth)
- d_ptr->m_objFile = QStringLiteral(":/defaultMeshes/cylinderSmooth");
- else
- d_ptr->m_objFile = QStringLiteral(":/defaultMeshes/cylinder");
- } else if (style == BevelBars) {
- if (smooth)
- d_ptr->m_objFile = QStringLiteral(":/defaultMeshes/bevelbarSmooth");
- else
- d_ptr->m_objFile = QStringLiteral(":/defaultMeshes/bevelbar");
- } else if (style == Spheres) {
- if (smooth)
- d_ptr->m_objFile = QStringLiteral(":/defaultMeshes/sphereSmooth");
- else
- d_ptr->m_objFile = QStringLiteral(":/defaultMeshes/sphere");
- }
- // Reload mesh data
- if (d_ptr->m_isInitialized)
- d_ptr->loadBarMesh();
+ d_ptr->m_shared->setBarType(style, smooth);
}
void Q3DMaps::setMeshFileName(const QString &objFileName)
{
- d_ptr->m_objFile = objFileName;
+ d_ptr->m_shared->setMeshFileName(objFileName);
}
-void Q3DMaps::setCameraPreset(CameraPreset preset)
+void Q3DMaps::setCameraPreset(QDataVis::CameraPreset preset)
{
- CameraHelper::setCameraPreset(preset);
+ d_ptr->m_shared->setCameraPreset(preset);
}
void Q3DMaps::setCameraPosition(GLfloat horizontal, GLfloat vertical, GLint distance)
{
- d_ptr->m_horizontalRotation = qBound(-180.0f, horizontal, 180.0f);
- d_ptr->m_verticalRotation = qBound(0.0f, vertical, 90.0f);
- d_ptr->m_zoomLevel = qBound(10, distance, 500);
- CameraHelper::setCameraRotation(QPointF(d_ptr->m_horizontalRotation,
- d_ptr->m_verticalRotation));
- //qDebug() << "camera rotation set to" << d_ptr->m_horizontalRotation << d_ptr->m_verticalRotation;
+ d_ptr->m_shared->setCameraPosition(horizontal, vertical, distance);
}
-void Q3DMaps::setTheme(ColorTheme theme)
+void Q3DMaps::setTheme(QDataVis::ColorTheme theme)
{
- d_ptr->m_theme->useTheme(theme);
- d_ptr->m_drawer->setTheme(*d_ptr->m_theme);
-#if !defined(QT_OPENGL_ES_2)
- if (d_ptr->m_shadowQuality > ShadowNone) {
- // Re-init shaders
- if (!d_ptr->m_theme->m_uniformColor) {
- d_ptr->initShaders(QStringLiteral(":/shaders/vertexShadow"),
- QStringLiteral(":/shaders/fragmentShadowNoTexColorOnY"));
- } else {
- d_ptr->initShaders(QStringLiteral(":/shaders/vertexShadow"),
- QStringLiteral(":/shaders/fragmentShadowNoTex"));
- }
- } else {
- // Re-init shaders
- if (!d_ptr->m_theme->m_uniformColor) {
- d_ptr->initShaders(QStringLiteral(":/shaders/vertex"),
- QStringLiteral(":/shaders/fragmentColorOnY"));
- } else {
- d_ptr->initShaders(QStringLiteral(":/shaders/vertex"),
- QStringLiteral(":/shaders/fragment"));
- }
- }
-#else
- if (!d_ptr->m_theme->m_uniformColor) {
- d_ptr->initShaders(QStringLiteral(":/shaders/vertexES2"),
- QStringLiteral(":/shaders/fragmentColorOnYES2"));
- } else {
- d_ptr->initShaders(QStringLiteral(":/shaders/vertexES2"),
- QStringLiteral(":/shaders/fragmentES2"));
- }
-#endif
- d_ptr->m_updateLabels = true;
+ d_ptr->m_shared->setTheme(theme);
}
void Q3DMaps::setBarColor(QColor baseColor, QColor heightColor, bool uniform)
{
- d_ptr->m_theme->m_baseColor = baseColor;
- d_ptr->m_theme->m_heightColor = heightColor;
- if (d_ptr->m_theme->m_uniformColor != uniform) {
-#if !defined(QT_OPENGL_ES_2)
- if (d_ptr->m_shadowQuality > ShadowNone) {
- // Re-init shaders
- if (!d_ptr->m_theme->m_uniformColor) {
- d_ptr->initShaders(QStringLiteral(":/shaders/vertexShadow"),
- QStringLiteral(":/shaders/fragmentShadowNoTexColorOnY"));
- } else {
- d_ptr->initShaders(QStringLiteral(":/shaders/vertexShadow"),
- QStringLiteral(":/shaders/fragmentShadowNoTex"));
- }
- } else {
- // Re-init shaders
- if (!d_ptr->m_theme->m_uniformColor) {
- d_ptr->initShaders(QStringLiteral(":/shaders/vertex"),
- QStringLiteral(":/shaders/fragmentColorOnY"));
- } else {
- d_ptr->initShaders(QStringLiteral(":/shaders/vertex"),
- QStringLiteral(":/shaders/fragment"));
- }
- }
-#else
- if (!d_ptr->m_theme->m_uniformColor) {
- d_ptr->initShaders(QStringLiteral(":/shaders/vertexES2"),
- QStringLiteral(":/shaders/fragmentColorOnYES2"));
- } else {
- d_ptr->initShaders(QStringLiteral(":/shaders/vertexES2"),
- QStringLiteral(":/shaders/fragmentES2"));
- }
-#endif
- }
- d_ptr->m_theme->m_uniformColor = uniform;
+ d_ptr->m_shared->setBarColor(baseColor, heightColor, uniform);
}
void Q3DMaps::setAreaSpecs(const QRect &areaRect, const QImage &image)
{
- d_ptr->calculateSceneScalingFactors(areaRect);
- setImage(image);
+ d_ptr->m_shared->setAreaSpecs(areaRect, image);
}
void Q3DMaps::setImage(const QImage &image)
{
- d_ptr->m_bgrHasAlpha = image.hasAlphaChannel();
- if (d_ptr->m_bgrTexture)
- glDeleteTextures(1, &d_ptr->m_bgrTexture);
- d_ptr->m_bgrTexture = d_ptr->m_textureHelper->create2DTexture(image, true, true);
+ d_ptr->m_shared->setImage(image);
}
-void Q3DMaps::setSelectionMode(SelectionMode mode)
+void Q3DMaps::setSelectionMode(QDataVis::SelectionMode mode)
{
- d_ptr->m_selectionMode = mode;
- // Disable zoom if mode changes
- //d_ptr->m_zoomActivated = false;
- //d_ptr->m_sceneViewPort = QRect(0, 0, width(), height());
+ d_ptr->m_shared->setSelectionMode(mode);
}
-SelectionMode Q3DMaps::selectionMode()
+QDataVis::SelectionMode Q3DMaps::selectionMode() const
{
- return d_ptr->m_selectionMode;
+ return d_ptr->m_shared->selectionMode();
}
void Q3DMaps::setWindowTitle(const QString &title)
@@ -1299,478 +200,71 @@ void Q3DMaps::setWindowTitle(const QString &title)
setTitle(title);
}
-QString Q3DMaps::windowTitle()
+QString Q3DMaps::windowTitle() const
{
return title();
}
void Q3DMaps::setFontSize(float fontsize)
{
- d_ptr->m_font.setPointSizeF(fontsize);
- d_ptr->m_drawer->setFont(d_ptr->m_font);
- d_ptr->m_updateLabels = true;
+ d_ptr->m_shared->setFontSize(fontsize);
}
-float Q3DMaps::fontSize()
+float Q3DMaps::fontSize() const
{
- return d_ptr->m_font.pointSizeF();
+ return d_ptr->m_shared->fontSize();
}
void Q3DMaps::setFont(const QFont &font)
{
- d_ptr->m_font = font;
- d_ptr->m_drawer->setFont(font);
- d_ptr->m_updateLabels = true;
-}
-
-QFont Q3DMaps::font()
-{
- return d_ptr->m_font;
-}
-
-void Q3DMaps::setLabelTransparency(LabelTransparency transparency)
-{
- d_ptr->m_labelTransparency = transparency;
- d_ptr->m_drawer->setTransparency(transparency);
- d_ptr->m_updateLabels = true;
-}
-
-LabelTransparency Q3DMaps::labelTransparency()
-{
- return d_ptr->m_labelTransparency;
+ d_ptr->m_shared->setFont(font);
}
-void Q3DMaps::setShadowQuality(ShadowQuality quality)
+QFont Q3DMaps::font() const
{
- d_ptr->m_shadowQuality = quality;
- switch (quality) {
- case ShadowLow:
- //qDebug() << "ShadowLow";
- d_ptr->m_shadowQualityToShader = 33.3f;
- break;
- case ShadowMedium:
- //qDebug() << "ShadowMedium";
- d_ptr->m_shadowQualityToShader = 100.0f;
- break;
- case ShadowHigh:
- //qDebug() << "ShadowHigh";
- d_ptr->m_shadowQualityToShader = 200.0f;
- break;
- default:
- d_ptr->m_shadowQualityToShader = 0.0f;
- break;
- }
- if (d_ptr->m_isInitialized) {
-#if !defined(QT_OPENGL_ES_2)
- if (d_ptr->m_shadowQuality > ShadowNone) {
- // Re-init depth buffer
- d_ptr->initDepthBuffer();
- // Re-init shaders
- if (!d_ptr->m_theme->m_uniformColor) {
- d_ptr->initShaders(QStringLiteral(":/shaders/vertexShadow"),
- QStringLiteral(":/shaders/fragmentShadowNoTexColorOnY"));
- } else {
- d_ptr->initShaders(QStringLiteral(":/shaders/vertexShadow"),
- QStringLiteral(":/shaders/fragmentShadowNoTex"));
- }
- d_ptr->initBackgroundShaders(QStringLiteral(":/shaders/vertexShadow"),
- QStringLiteral(":/shaders/fragmentShadow"));
- } else {
- // Re-init shaders
- if (!d_ptr->m_theme->m_uniformColor) {
- d_ptr->initShaders(QStringLiteral(":/shaders/vertex"),
- QStringLiteral(":/shaders/fragmentColorOnY"));
- } else {
- d_ptr->initShaders(QStringLiteral(":/shaders/vertex"),
- QStringLiteral(":/shaders/fragment"));
- }
- d_ptr->initBackgroundShaders(QStringLiteral(":/shaders/vertexTexture"),
- QStringLiteral(":/shaders/fragmentTexture"));
- }
-#else
- if (!d_ptr->m_theme->m_uniformColor) {
- d_ptr->initShaders(QStringLiteral(":/shaders/vertexES2"),
- QStringLiteral(":/shaders/fragmentColorOnYES2"));
- } else {
- d_ptr->initShaders(QStringLiteral(":/shaders/vertexES2"),
- QStringLiteral(":/shaders/fragmentES2"));
- }
- d_ptr->initBackgroundShaders(QStringLiteral(":/shaders/vertexTexture"), // Same vertex shader ok for ES2
- QStringLiteral(":/shaders/fragmentTextureES2"));
-#endif
- }
+ return d_ptr->m_shared->font();
}
-ShadowQuality Q3DMaps::shadowQuality()
+void Q3DMaps::setLabelTransparency(QDataVis::LabelTransparency transparency)
{
- return d_ptr->m_shadowQuality;
+ d_ptr->m_shared->setLabelTransparency(transparency);
}
-bool Q3DMaps::addDataItem(QDataItem* dataItem)
+QDataVis::LabelTransparency Q3DMaps::labelTransparency() const
{
- // Check validity
- if (!d_ptr->isValid(*dataItem))
- return false;
- // Convert position to translation
- d_ptr->calculateTranslation(dataItem);
- // Add item
- d_ptr->m_data->addItem(dataItem);
- // Get the limits
- QPair<GLfloat, GLfloat> limits = d_ptr->m_data->d_ptr->limitValues();
- d_ptr->m_heightNormalizer = (GLfloat)qMax(qFabs(limits.second), qFabs(limits.first));
- d_ptr->calculateHeightAdjustment(limits);
- return true;
+ return d_ptr->m_shared->labelTransparency();
}
-bool Q3DMaps::addData(const QVector<QDataItem*> &data)
+QDataVis::ShadowQuality Q3DMaps::setShadowQuality(QDataVis::ShadowQuality quality)
{
- // Convert to QDataRow
- for (int i = 0; i < data.size(); i++) {
- QDataItem *item = data.at(i);
- // Check validity
- if (!d_ptr->isValid(*item)) {
- return false;
- } else {
- // Convert position to translation
- d_ptr->calculateTranslation(item);
- // Add item
- d_ptr->m_data->addItem(item);
- }
- }
- // Get the limits
- QPair<GLfloat, GLfloat> limits = d_ptr->m_data->d_ptr->limitValues();
- d_ptr->m_heightNormalizer = (GLfloat)qMax(qFabs(limits.second), qFabs(limits.first));
- d_ptr->calculateHeightAdjustment(limits);
- return true;
+ return d_ptr->m_shared->setShadowQuality(quality);
}
-bool Q3DMaps::addData(const QDataRow &dataRow)
+QDataVis::ShadowQuality Q3DMaps::shadowQuality() const
{
- for (int itemIdx = 0; itemIdx < dataRow.d_ptr->row().size(); itemIdx++) {
- QDataItem *item = dataRow.d_ptr->getItem(itemIdx);
- // Check validity
- if (!d_ptr->isValid(*item)) {
- return false;
- } else {
- // Convert position to translation
- d_ptr->calculateTranslation(item);
- // Add item
- d_ptr->m_data->addItem(item);
- }
- }
- // Get the limits
- QPair<GLfloat, GLfloat> limits = d_ptr->m_data->d_ptr->limitValues();
- d_ptr->m_heightNormalizer = (GLfloat)qMax(qFabs(limits.second), qFabs(limits.first));
- d_ptr->calculateHeightAdjustment(limits);
- return true;
+ return d_ptr->m_shared->shadowQuality();
}
-bool Q3DMaps::setData(const QVector<QDataItem*> &dataRow)
+void Q3DMaps::setDataProxy(QMapDataProxy *proxy)
{
- // Delete previous data
- delete d_ptr->m_data;
- // Convert to QDataRow
- d_ptr->m_data = new QDataRow();
- for (int i = 0; i < dataRow.size(); i++) {
- QDataItem *item = dataRow.at(i);
- // Check validity
- if (!d_ptr->isValid(*item)) {
- return false;
- } else {
- // Convert position to translation
- d_ptr->calculateTranslation(item);
- // Add item
- d_ptr->m_data->addItem(item);
- }
- }
- // Get the limits
- QPair<GLfloat, GLfloat> limits = d_ptr->m_data->d_ptr->limitValues();
- d_ptr->m_heightNormalizer = (GLfloat)qMax(qFabs(limits.second), qFabs(limits.first));
- d_ptr->calculateHeightAdjustment(limits);
- return true;
+ d_ptr->m_shared->setDataProxy(proxy);
}
-bool Q3DMaps::setData(QDataRow *dataRow)
+QMapDataProxy *Q3DMaps::dataProxy()
{
- // Check validity
- for (int i = 0; i < dataRow->d_ptr->row().size(); i++) {
- if (!d_ptr->isValid(*dataRow->d_ptr->row().at(i)))
- return false;
- else
- d_ptr->calculateTranslation(dataRow->d_ptr->row()[i]);
- }
- // Delete previous data
- delete d_ptr->m_data;
- // Set give data as new data
- d_ptr->m_data = dataRow;
- // Get the limits
- QPair<GLfloat, GLfloat> limits = d_ptr->m_data->d_ptr->limitValues();
- d_ptr->m_heightNormalizer = (GLfloat)qMax(qFabs(limits.second), qFabs(limits.first));
- d_ptr->calculateHeightAdjustment(limits);
- return true;
+ return d_ptr->m_shared->dataProxy();
}
-Q3DMapsPrivate::Q3DMapsPrivate(Q3DMaps *q)
+Q3DMapsPrivate::Q3DMapsPrivate(Q3DMaps *q, const QRect &rect)
: q_ptr(q),
- m_paintDevice(0),
- m_barShader(0),
- m_depthShader(0),
- m_selectionShader(0),
- m_backgroundShader(0),
- m_labelShader(0),
- m_barObj(0),
- m_backgroundObj(0),
- m_gridLineObj(0),
- m_labelObj(0),
- m_objFile(QStringLiteral(":/defaultMeshes/bar")),
- m_mousePressed(MouseNone),
- m_mousePos(QPoint(0, 0)),
- m_zoomLevel(100),
- m_zoomAdjustment(1.0f),
- m_horizontalRotation(0.0f),
- m_verticalRotation(45.0f),
- m_barThickness(QVector3D(1.0f, 0.0f, 1.0f)),
- m_heightNormalizer(0.0f),
- m_yAdjustment(0.0f),
- m_scaleFactor(1.0f),
- m_theme(new Theme()),
- m_isInitialized(false),
- m_selectionMode(ModeBar),
- m_selectedBar(0),
- m_data(new QDataRow()),
- m_axisLabelX(QStringLiteral("X")),
- m_axisLabelZ(QStringLiteral("Z")),
- m_axisLabelY(QStringLiteral("Y")),
- m_sceneViewPort(0, 0, q->width(), q->height()),
- m_zoomViewPort(0, 0, q->width(), q->height()),
- m_zoomActivated(false),
- m_textureHelper(new TextureHelper()),
- m_labelTransparency(TransparencyFromTheme),
- m_font(QFont(QStringLiteral("Arial"))),
- m_drawer(new Drawer(*m_theme, m_font, m_labelTransparency)),
- m_areaSize(QSizeF(1.0f, 1.0f)),
- m_bgrTexture(0),
- m_depthTexture(0),
- m_selectionTexture(0),
- m_depthFrameBuffer(0),
- m_selectionFrameBuffer(0),
- m_selectionDepthBuffer(0),
- m_updateLabels(true),
- m_shadowQuality(ShadowLow),
- m_shadowQualityToShader(33.3f),
- m_bgrHasAlpha(false)
+ m_shared(new Maps3DController(rect))
{
- //m_data->d_ptr->setDrawer(m_drawer);
- //QObject::connect(m_drawer, &Drawer::drawerChanged, this, &Q3DMapsPrivate::updateTextures);
}
Q3DMapsPrivate::~Q3DMapsPrivate()
{
- m_textureHelper->glDeleteFramebuffers(1, &m_depthFrameBuffer);
- m_textureHelper->glDeleteFramebuffers(1, &m_selectionFrameBuffer);
- m_textureHelper->glDeleteRenderbuffers(1, &m_selectionDepthBuffer);
- m_textureHelper->deleteTexture(&m_selectionTexture);
- m_textureHelper->deleteTexture(&m_bgrTexture);
- delete m_data;
- delete m_barShader;
- delete m_selectionShader;
- delete m_backgroundShader;
- delete m_barObj;
- delete m_backgroundObj;
- delete m_gridLineObj;
- delete m_textureHelper;
- delete m_drawer;
-}
-
-void Q3DMapsPrivate::loadBarMesh()
-{
- if (m_barObj)
- delete m_barObj;
- m_barObj = new ObjectHelper(m_objFile);
- m_barObj->load();
-}
-
-void Q3DMapsPrivate::loadBackgroundMesh()
-{
- if (m_backgroundObj)
- delete m_backgroundObj;
- m_backgroundObj = new ObjectHelper(QStringLiteral(":/defaultMeshes/label"));
- m_backgroundObj->load();
-}
-
-void Q3DMapsPrivate::loadGridLineMesh()
-{
- if (m_gridLineObj)
- delete m_gridLineObj;
- m_gridLineObj = new ObjectHelper(QStringLiteral(":/defaultMeshes/bar"));
- m_gridLineObj->load();
-}
-
-void Q3DMapsPrivate::loadLabelMesh()
-{
- if (m_labelObj)
- delete m_labelObj;
- m_labelObj = new ObjectHelper(QStringLiteral(":/defaultMeshes/label"));
- m_labelObj->load();
-}
-
-void Q3DMapsPrivate::initShaders(const QString &vertexShader, const QString &fragmentShader)
-{
- if (m_barShader)
- delete m_barShader;
- m_barShader = new ShaderHelper(q_ptr, vertexShader, fragmentShader);
- m_barShader->initialize();
-}
-
-void Q3DMapsPrivate::initSelectionShader()
-{
- if (m_selectionShader)
- delete m_selectionShader;
- m_selectionShader = new ShaderHelper(q_ptr, QStringLiteral(":/shaders/vertexSelection"),
- QStringLiteral(":/shaders/fragmentSelection"));
- m_selectionShader->initialize();
-}
-
-void Q3DMapsPrivate::initSelectionBuffer()
-{
- if (m_selectionTexture) {
-
- m_textureHelper->glDeleteFramebuffers(1, &m_selectionFrameBuffer);
- m_textureHelper->glDeleteRenderbuffers(1, &m_selectionDepthBuffer);
- m_textureHelper->deleteTexture(&m_selectionTexture);
- }
- m_selectionTexture = m_textureHelper->createSelectionTexture(q_ptr->size(),
- m_selectionFrameBuffer,
- m_selectionDepthBuffer);
-}
-
-#if !defined(QT_OPENGL_ES_2)
-void Q3DMapsPrivate::initDepthShader()
-{
- if (m_depthShader)
- delete m_depthShader;
- m_depthShader = new ShaderHelper(q_ptr, QStringLiteral(":/shaders/vertexDepth"),
- QStringLiteral(":/shaders/fragmentDepth"));
- m_depthShader->initialize();
-}
-
-void Q3DMapsPrivate::initDepthBuffer()
-{
- if (m_depthTexture) {
- m_textureHelper->glDeleteFramebuffers(1, &m_depthFrameBuffer);
- m_textureHelper->deleteTexture(&m_depthTexture);
- }
- m_depthTexture = m_textureHelper->createDepthTexture(q_ptr->size(), m_depthFrameBuffer,
- m_shadowQuality);
-}
-#endif
-
-void Q3DMapsPrivate::initBackgroundShaders(const QString &vertexShader,
- const QString &fragmentShader)
-{
- if (m_backgroundShader)
- delete m_backgroundShader;
- m_backgroundShader = new ShaderHelper(q_ptr, vertexShader, fragmentShader);
- m_backgroundShader->initialize();
-}
-
-void Q3DMapsPrivate::initLabelShaders(const QString &vertexShader, const QString &fragmentShader)
-{
- if (m_labelShader)
- delete m_labelShader;
- m_labelShader = new ShaderHelper(q_ptr, vertexShader, fragmentShader);
- // m_labelShader = new ShaderHelper(q_ptr, QStringLiteral(":/shaders/testDepthVert"),
- // QStringLiteral(":/shaders/testDepthFrag"));
- m_labelShader->initialize();
-}
-
-void Q3DMapsPrivate::updateTextures()
-{
- // Drawer has changed; this flag needs to be checked when checking if we need to update labels
- m_updateLabels = true;
-}
-
-void Q3DMapsPrivate::calculateSceneScalingFactors(const QRect &areaRect)
-{
- m_areaSize = areaRect.size();
- // Calculate scaling factor so that we can be sure the whole area fits to positive z space
- if (zComp > 1.0f)
- m_scaleFactor = qMax(m_areaSize.width(), m_areaSize.height()) / zComp;
- else
- m_scaleFactor = qMax(m_areaSize.width(), m_areaSize.height());
- //qDebug() << "scaleFactor" << m_scaleFactor;
-}
-
-void Q3DMapsPrivate::calculateHeightAdjustment(const QPair<GLfloat, GLfloat> &limits)
-{
- // 2.0f = max difference between minimum and maximum value after scaling with m_heightNormalizer
- m_yAdjustment = 2.0f - ((limits.second - limits.first) / m_heightNormalizer);
- //qDebug() << m_yAdjustment;
-}
-
-void Q3DMapsPrivate::calculateTranslation(QDataItem *item)
-{
- // We need to convert position (which is in coordinates), to translation (which has origin in the center and is scaled)
- // -> move pos(center, center) to trans(0, 0) and pos(0, 0) to trans(left, top)
- GLfloat xTrans = 2.0f * (item->d_ptr->position().x() - (m_areaSize.width() / 2.0f))
- / m_scaleFactor;
- GLfloat zTrans = 2.0f * (item->d_ptr->position().y() - (m_areaSize.height() / 2.0f))
- / m_scaleFactor;
- //qDebug() << "x, y" << item->d_ptr->position().x() << item->d_ptr->position().y();
- item->d_ptr->setTranslation(QVector3D(xTrans, 0.0f, zTrans + zComp));
- //qDebug() << item->d_ptr->translation();
-}
-
-Q3DMapsPrivate::SelectionType Q3DMapsPrivate::isSelected(GLint bar, const QVector3D &selection)
-{
- GLubyte barIdxRed = 0;
- GLubyte barIdxGreen = 0;
- GLubyte barIdxBlue = 0;
- //static QVector3D prevSel = selection; // TODO: For debugging
- SelectionType isSelectedType = SelectionNone;
-
- if (selection == skipColor)
- return isSelectedType; // skip window
-
- if (bar <= 255) {
- barIdxRed = bar;
- } else if (bar <= 65535) {
- barIdxGreen = bar / 256;
- barIdxRed = bar % 256;
- } else {
- barIdxBlue = bar / 65535;
- barIdxGreen = bar % 65535;
- barIdxRed = bar % 256;
- }
-
- QVector3D current = QVector3D(barIdxRed, barIdxGreen, barIdxBlue);
-
- // TODO: For debugging
- //if (selection != prevSel) {
- // qDebug() << selection.x() << selection .y() << selection.z();
- // prevSel = selection;
- //}
-
- if (current == selection)
- isSelectedType = SelectionBar;
-
- return isSelectedType;
-}
-
-bool Q3DMapsPrivate::isValid(const QDataItem &item)
-{
- bool retval = true;
- if (item.d_ptr->value() < 0) {
- qCritical("Data item value out of range");
- retval = false;
- } else if (item.d_ptr->position().x() < 0 || item.d_ptr->position().x() > m_areaSize.width()) {
- qCritical("Data item x position out of range");
- retval = false;
- } else if (item.d_ptr->position().y() < 0 || item.d_ptr->position().y() > m_areaSize.height()) {
- qCritical("Data item y position out of range");
- retval = false;
- }
- return retval;
+ qDebug() << "Destroying Q3DMapsPrivate";
+ delete m_shared;
}
-QTENTERPRISE_DATAVIS3D_END_NAMESPACE
+QT_DATAVIS3D_END_NAMESPACE