summaryrefslogtreecommitdiffstats
path: root/src/datavis3d/engine/bars3dcontroller_p.h
diff options
context:
space:
mode:
authorKeränen Pasi <pasi.keranen@digia.com>2013-06-14 09:31:51 +0300
committerPasi Keränen <pasi.keranen@digia.com>2013-06-14 09:46:48 +0300
commit8129d95e6cd49f36274d3ccdc370b36dc5232161 (patch)
tree92222ee509a0a6deefd139f452f7635772f3c836 /src/datavis3d/engine/bars3dcontroller_p.h
parentd7ebab1657fe8f1b0992a081ffd4047aad61a8e3 (diff)
Rendering code placeholder added for 3D Bars.
Change-Id: I23d815dace8298d034c339c90e7bc0a0a4375d77 Reviewed-by: Tomi Korpipää <tomi.korpipaa@digia.com>
Diffstat (limited to 'src/datavis3d/engine/bars3dcontroller_p.h')
-rw-r--r--src/datavis3d/engine/bars3dcontroller_p.h342
1 files changed, 342 insertions, 0 deletions
diff --git a/src/datavis3d/engine/bars3dcontroller_p.h b/src/datavis3d/engine/bars3dcontroller_p.h
new file mode 100644
index 00000000..b02cec34
--- /dev/null
+++ b/src/datavis3d/engine/bars3dcontroller_p.h
@@ -0,0 +1,342 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** 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
+** 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.
+**
+** 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$
+**
+****************************************************************************/
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+
+#ifndef Q3DBARSSHARED_p_H
+#define Q3DBARSSHARED_p_H
+
+#include "QtDataVis3D/qdatavis3dglobal.h"
+#include "QtDataVis3D/qdatavis3namespace.h"
+
+#include <QtCore/QSize>
+#include <QtCore/QObject>
+#include <QtGui/QOpenGLFunctions>
+#include <QtGui/QFont>
+
+#include <QWindow>
+
+class QOpenGLPaintDevice;
+class QPoint;
+class QSizeF;
+class QOpenGLShaderProgram;
+
+QT_DATAVIS3D_BEGIN_NAMESPACE
+
+class QDataItem;
+class QDataRow;
+class QDataSet;
+class ShaderHelper;
+class ObjectHelper;
+class TextureHelper;
+class Theme;
+class Drawer;
+class LabelItem;
+class Bars3dController;
+class Bars3dRenderer;
+
+class QT_DATAVIS3D_EXPORT Bars3dController : public QObject, public QOpenGLFunctions
+{
+ Q_OBJECT
+
+public:
+ enum SelectionType {
+ SelectionNone = 0,
+ SelectionBar,
+ SelectionRow,
+ SelectionColumn
+ };
+
+ enum MousePressType {
+ MouseNone = 0,
+ MouseOnScene,
+ MouseOnOverview,
+ MouseOnZoom,
+ MouseRotating,
+ MouseOnPinch
+ };
+
+ // TODO: Filter to the set of attributes to be moved to the model object.
+ // * All GL rendering only related attribs should be moved out of this public set.
+ // * All attribs that are modifiable from QML need to e in this set.
+
+ // Interaction related parameters
+ MousePressType m_mousePressed;
+ QPoint m_mousePos;
+ SelectionMode m_selectionMode;
+
+ // Visual parameters
+ QRect m_boundingRect;
+ QString m_objFile;
+ Theme *m_theme;
+ LabelTransparency m_labelTransparency;
+ QFont m_font;
+ bool m_gridEnabled;
+ bool m_bgrEnabled;
+ ShadowQuality m_shadowQuality;
+
+ // Data parameters
+ QPair<int, int> m_sampleCount;
+ QDataItem *m_selectedBar;
+ QDataSet *m_dataSet;
+ QString m_axisLabelX;
+ QString m_axisLabelZ;
+ QString m_axisLabelY;
+ QDataRow *m_zoomSelection;
+ GLint m_tickCount;
+ GLfloat m_tickStep;
+ bool m_negativeValues;
+
+ Bars3dRenderer *m_renderer;
+
+private:
+
+ // Internal attributes purely related to how the scene is drawn with GL.
+ bool m_xFlipped;
+ bool m_zFlipped;
+ bool m_yFlipped;
+ QRect m_sceneViewPort;
+ QRect m_zoomViewPort;
+ bool m_zoomActivated;
+ QOpenGLPaintDevice *m_paintDevice;
+ bool m_updateLabels;
+ bool m_isInitialized;
+ ShaderHelper *m_barShader;
+ ShaderHelper *m_depthShader;
+ ShaderHelper *m_selectionShader;
+ ShaderHelper *m_backgroundShader;
+ ShaderHelper *m_labelShader;
+ ObjectHelper *m_barObj;
+ ObjectHelper *m_backgroundObj;
+ ObjectHelper *m_gridLineObj;
+ ObjectHelper *m_labelObj;
+ TextureHelper *m_textureHelper;
+ Drawer *m_drawer;
+ GLuint m_bgrTexture;
+ GLuint m_depthTexture;
+ GLuint m_selectionTexture;
+ GLuint m_depthFrameBuffer;
+ GLuint m_selectionFrameBuffer;
+ GLuint m_selectionDepthBuffer;
+ GLfloat m_shadowQualityToShader;
+ GLuint m_fbohandle;
+ GLint m_zoomLevel;
+ GLfloat m_zoomAdjustment;
+ GLfloat m_horizontalRotation;
+ GLfloat m_verticalRotation;
+ QSizeF m_barThickness;
+ QSizeF m_barSpacing;
+ GLfloat m_heightNormalizer;
+ GLfloat m_yAdjustment;
+ GLfloat m_rowWidth;
+ GLfloat m_columnDepth;
+ GLfloat m_maxDimension;
+ GLfloat m_scaleX;
+ GLfloat m_scaleZ;
+ GLfloat m_scaleFactor;
+ GLfloat m_maxSceneSize;
+
+public:
+ explicit Bars3dController(QRect rect, GLuint fbohandle=0);
+ ~Bars3dController();
+
+ void initializeOpenGL();
+ void render();
+
+ // Add a row of data. Each new row is added to the front of the sample space, moving previous
+ // rows back (if sample space is more than one row deep)
+ void addDataRow(const QVector<GLfloat> &dataRow,
+ const QString &labelRow = QString(),
+ const QVector<QString> &labelsColumn = QVector<QString>());
+ // ownership of dataItems is transferred
+ void addDataRow(const QVector<QDataItem*> &dataRow,
+ const QString &labelRow = QString(),
+ const QVector<QString> &labelsColumn = QVector<QString>());
+ // ownership of dataRow is transferred
+ void addDataRow(QDataRow *dataRow);
+
+ // Add complete data set at a time, as a vector of data rows
+ void addDataSet(const QVector< QVector<GLfloat> > &data,
+ const QVector<QString> &labelsRow = QVector<QString>(),
+ const QVector<QString> &labelsColumn = QVector<QString>());
+
+ // ownership of dataItems is transferred
+ void addDataSet(const QVector< QVector<QDataItem*> > &data,
+ const QVector<QString> &labelsRow = QVector<QString>(),
+ const QVector<QString> &labelsColumn = QVector<QString>());
+ // ownership of dataSet is transferred
+ void addDataSet(QDataSet* dataSet);
+
+ // bar thickness, spacing between bars, and is spacing relative to thickness or absolute
+ // y -component sets the thickness/spacing of z -direction
+ // With relative 0.0f means side-to-side, 1.0f = one thickness in between
+ void setBarSpecs(QSizeF thickness = QSizeF(1.0f, 1.0f),
+ QSizeF spacing = QSizeF(1.0f, 1.0f),
+ bool relative = true);
+
+ // bar type; bars (=cubes), pyramids, cones, cylinders, etc.
+ void setBarType(BarStyle style, bool smooth = false);
+
+ // override bar type with own mesh
+ void setMeshFileName(const QString &objFileName);
+
+ // how many samples per row and column, and names for axes
+ void setupSampleSpace(int samplesRow, int samplesColumn,
+ const QString &labelRow = QString(),
+ const QString &labelColumn = QString(),
+ const QString &labelHeight = QString());
+
+ // Select preset camera placement
+ void setCameraPreset(CameraPreset preset);
+
+ // Set camera rotation if you don't want to use the presets (in horizontal (-180...180) and
+ // vertical (0...90) (or (-90...90) if there are negative values) angles and distance in
+ // percentage (10...500))
+ void setCameraPosition(GLfloat horizontal, GLfloat vertical, GLint distance = 100);
+
+ // Set theme (bar colors, shaders, window color, background colors, light intensity and text
+ // colors are affected)
+ void setTheme(ColorTheme theme);
+
+ // Set color if you don't want to use themes. Set uniform to false if you want the (height)
+ // color to change from bottom to top
+ void setBarColor(QColor baseColor, QColor heightColor, QColor depthColor,
+ bool uniform = true);
+
+ // Set tick count and step. Note; tickCount * step should be the maximum possible value of data
+ // set. Minimum is the absolute minimum possible value a bar can have. This is especially
+ // important to set if values can be negative.
+ void setTickCount(GLint tickCount, GLfloat step, GLfloat minimum = 0.0f);
+
+ // TODO: light placement API
+
+ // Size
+ const QSize size();
+ const QRect boundingRect();
+ void setBoundingRect(const QRect boundingRect);
+ void setWidth(const int width);
+ int width();
+ void setHeight(const int height);
+ int height();
+ void setX(const int x);
+ int x();
+ void setY(const int y);
+ int y();
+
+ // Change selection mode; single bar, bar and row, bar and column, or all
+ void setSelectionMode(SelectionMode mode);
+ SelectionMode selectionMode();
+
+ // Font size adjustment
+ void setFontSize(float fontsize);
+ float fontSize();
+
+ // Set font
+ void setFont(const QFont &font);
+ QFont font();
+
+ // Label transparency adjustment
+ void setLabelTransparency(LabelTransparency transparency);
+ LabelTransparency labelTransparency();
+
+ // Enable or disable background grid
+ void setGridEnabled(bool enable);
+ bool gridEnabled();
+
+ // Enable or disable background mesh
+ void setBackgroundEnabled(bool enable);
+ bool backgroundEnabled();
+
+ // Adjust shadow quality
+ void setShadowQuality(ShadowQuality quality);
+ ShadowQuality shadowQuality();
+
+#if defined(Q_OS_ANDROID)
+ void mouseDoubleClickEvent(QMouseEvent *event);
+ void touchEvent(QTouchEvent *event);
+#endif
+ void mousePressEvent(QMouseEvent *event);
+ void mouseReleaseEvent(QMouseEvent *event);
+ void mouseMoveEvent(QMouseEvent *event);
+ void wheelEvent(QWheelEvent *event);
+ void resizeNotify();
+
+ void loadBarMesh();
+ void loadBackgroundMesh();
+ void loadGridLineMesh();
+ void loadLabelMesh();
+ void initShaders(const QString &vertexShader, const QString &fragmentShader);
+ void initSelectionShader();
+ void initBackgroundShaders(const QString &vertexShader, const QString &fragmentShader);
+ void initLabelShaders(const QString &vertexShader, const QString &fragmentShader);
+ void initSelectionBuffer();
+#if !defined(QT_OPENGL_ES_2)
+ void initDepthShader();
+ void initDepthBuffer();
+#endif
+ void updateTextures();
+ void calculateSceneScalingFactors();
+ void calculateHeightAdjustment(const QPair<GLfloat, GLfloat> &limits);
+ SelectionType isSelected(GLint row, GLint bar, const QVector3D &selection);
+ void handleLimitChange();
+ void closeZoomMode();
+
+private:
+ void drawZoomScene();
+ void drawScene();
+ Q_DISABLE_COPY(Bars3dController)
+
+ friend class DeclarativeBars;
+ friend class DeclarativeBarsRenderer;
+};
+
+
+QT_DATAVIS3D_END_NAMESPACE
+
+#endif