1/****************************************************************************
2**
3** Copyright (C) 2016 The Qt Company Ltd.
4** Contact: https://www.qt.io/licensing/
5**
6** This file is part of the Qt Data Visualization module of the Qt Toolkit.
7**
8** $QT_BEGIN_LICENSE:GPL$
9** Commercial License Usage
10** Licensees holding valid commercial Qt licenses may use this file in
11** accordance with the commercial license agreement provided with the
12** Software or, alternatively, in accordance with the terms contained in
13** a written agreement between you and The Qt Company. For licensing terms
14** and conditions see https://www.qt.io/terms-conditions. For further
15** information use the contact form at https://www.qt.io/contact-us.
16**
17** GNU General Public License Usage
18** Alternatively, this file may be used under the terms of the GNU
19** General Public License version 3 or (at your option) any later version
20** approved by the KDE Free Qt Foundation. The licenses are as published by
21** the Free Software Foundation and appearing in the file LICENSE.GPL3
22** included in the packaging of this file. Please review the following
23** information to ensure the GNU General Public License requirements will
24** be met: https://www.gnu.org/licenses/gpl-3.0.html.
25**
26** $QT_END_LICENSE$
27**
28****************************************************************************/
29
30//
31// W A R N I N G
32// -------------
33//
34// This file is not part of the QtDataVisualization API. It exists purely as an
35// implementation detail. This header file may change from version to
36// version without notice, or even be removed.
37//
38// We mean it.
39
40#ifndef SURFACE3DRENDERER_P_H
41#define SURFACE3DRENDERER_P_H
42
43#include "datavisualizationglobal_p.h"
44#include "surface3dcontroller_p.h"
45#include "abstract3drenderer_p.h"
46#include "surfaceseriesrendercache_p.h"
47
48QT_BEGIN_NAMESPACE_DATAVISUALIZATION
49
50class ShaderHelper;
51class Q3DScene;
52
53class QT_DATAVISUALIZATION_EXPORT Surface3DRenderer : public Abstract3DRenderer
54{
55 Q_OBJECT
56
57private:
58 bool m_cachedIsSlicingActivated;
59
60 // Internal attributes purely related to how the scene is drawn with GL.
61 ShaderHelper *m_depthShader;
62 ShaderHelper *m_backgroundShader;
63 ShaderHelper *m_surfaceFlatShader;
64 ShaderHelper *m_surfaceSmoothShader;
65 ShaderHelper *m_surfaceTexturedSmoothShader;
66 ShaderHelper *m_surfaceTexturedFlatShader;
67 ShaderHelper *m_surfaceGridShader;
68 ShaderHelper *m_surfaceSliceFlatShader;
69 ShaderHelper *m_surfaceSliceSmoothShader;
70 ShaderHelper *m_selectionShader;
71 float m_heightNormalizer;
72 float m_scaleX;
73 float m_scaleY;
74 float m_scaleZ;
75 GLuint m_depthFrameBuffer;
76 GLuint m_selectionFrameBuffer;
77 GLuint m_selectionDepthBuffer;
78 GLuint m_selectionResultTexture;
79 GLfloat m_shadowQualityToShader;
80 bool m_flatSupported;
81 bool m_selectionActive;
82 AbstractRenderItem m_dummyRenderItem;
83 GLint m_shadowQualityMultiplier;
84 QPoint m_selectedPoint;
85 QSurface3DSeries *m_selectedSeries;
86 QPoint m_clickedPosition;
87 bool m_selectionTexturesDirty;
88 GLuint m_noShadowTexture;
89 bool m_flipHorizontalGrid;
90
91public:
92 explicit Surface3DRenderer(Surface3DController *controller);
93 ~Surface3DRenderer();
94
95 void updateData();
96 void updateSeries(const QList<QAbstract3DSeries *> &seriesList);
97 void updateSurfaceTextures(QVector<QSurface3DSeries *> seriesList);
98 SeriesRenderCache *createNewCache(QAbstract3DSeries *series);
99 void cleanCache(SeriesRenderCache *cache);
100 void updateSelectionMode(QAbstract3DGraph::SelectionFlags mode);
101 void updateRows(const QVector<Surface3DController::ChangeRow> &rows);
102 void updateItems(const QVector<Surface3DController::ChangeItem> &points);
103 void updateScene(Q3DScene *scene);
104 void updateSlicingActive(bool isSlicing);
105 void updateSelectedPoint(const QPoint &position, QSurface3DSeries *series);
106 void updateFlipHorizontalGrid(bool flip);
107 inline QPoint clickedPosition() const { return m_clickedPosition; }
108 void resetClickedStatus();
109 QVector3D convertPositionToTranslation(const QVector3D &position, bool isAbsolute);
110 void updateAxisLabels(QAbstract3DAxis::AxisOrientation orientation,
111 const QStringList &labels);
112 void updateAxisTitleVisibility(QAbstract3DAxis::AxisOrientation orientation,
113 bool visible);
114 void updateMargin(float margin);
115
116 void render(GLuint defaultFboHandle = 0);
117
118protected:
119 void contextCleanup();
120 void initializeOpenGL();
121 virtual void fixCameraTarget(QVector3D &target);
122 virtual void getVisibleItemBounds(QVector3D &minBounds, QVector3D &maxBounds);
123
124Q_SIGNALS:
125 void flatShadingSupportedChanged(bool supported);
126
127private:
128 void checkFlatSupport(SurfaceSeriesRenderCache *cache);
129 void updateObjects(SurfaceSeriesRenderCache *cache, bool dimensionChanged);
130 void updateSliceDataModel(const QPoint &point);
131 QPoint mapCoordsToSampleSpace(SurfaceSeriesRenderCache *cache, const QPointF &coords);
132 void findMatchingRow(float z, int &sample, int direction, QSurfaceDataArray &dataArray);
133 void findMatchingColumn(float x, int &sample, int direction, QSurfaceDataArray &dataArray);
134 void updateSliceObject(SurfaceSeriesRenderCache *cache, const QPoint &point);
135 void updateShadowQuality(QAbstract3DGraph::ShadowQuality quality);
136 void updateTextures();
137 void initShaders(const QString &vertexShader, const QString &fragmentShader);
138 QRect calculateSampleRect(const QSurfaceDataArray &array);
139 void loadBackgroundMesh();
140
141 void drawSlicedScene();
142 void drawScene(GLuint defaultFboHandle);
143 void drawLabels(bool drawSelection, const Q3DCamera *activeCamera,
144 const QMatrix4x4 &viewMatrix, const QMatrix4x4 &projectionMatrix);
145
146 void calculateSceneScalingFactors();
147 void initBackgroundShaders(const QString &vertexShader, const QString &fragmentShader);
148 void initSelectionShaders();
149 void initSurfaceShaders();
150 void initSelectionBuffer();
151 void initDepthShader();
152 void updateSelectionTextures();
153 void createSelectionTexture(SurfaceSeriesRenderCache *cache, uint &lastSelectionId);
154 void idToRGBA(uint id, uchar *r, uchar *g, uchar *b, uchar *a);
155 void fillIdCorner(uchar *p, uchar r, uchar g, uchar b, uchar a);
156 void surfacePointSelected(const QPoint &point);
157 void updateSelectionPoint(SurfaceSeriesRenderCache *cache, const QPoint &point, bool label);
158 QPoint selectionIdToSurfacePoint(uint id);
159 void updateDepthBuffer();
160 void emitSelectedPointChanged(QPoint position);
161
162 Q_DISABLE_COPY(Surface3DRenderer)
163
164 friend class SurfaceObject;
165};
166
167QT_END_NAMESPACE_DATAVISUALIZATION
168
169#endif
170

source code of qtdatavis3d/src/datavisualization/engine/surface3drenderer_p.h