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 ABSTRACT3DRENDERER_P_H
41#define ABSTRACT3DRENDERER_P_H
42
43#include <QtGui/QOpenGLFunctions>
44#if !defined(QT_OPENGL_ES_2)
45# include <QtGui/QOpenGLFunctions_2_1>
46#endif
47#include "datavisualizationglobal_p.h"
48#include "abstract3dcontroller_p.h"
49#include "axisrendercache_p.h"
50#include "seriesrendercache_p.h"
51#include "customrenderitem_p.h"
52
53QT_FORWARD_DECLARE_CLASS(QOffscreenSurface)
54
55QT_BEGIN_NAMESPACE_DATAVISUALIZATION
56
57class TextureHelper;
58class Theme;
59class Drawer;
60
61class Abstract3DRenderer : public QObject, protected QOpenGLFunctions
62{
63 Q_OBJECT
64
65protected:
66 enum SelectionState {
67 SelectNone = 0,
68 SelectOnScene,
69 SelectOnOverview,
70 SelectOnSlice
71 };
72
73 enum RenderingState {
74 RenderingNormal = 0,
75 RenderingSelection,
76 RenderingDepth
77 };
78
79public:
80 virtual ~Abstract3DRenderer();
81
82 virtual void updateData() = 0;
83 virtual void updateSeries(const QList<QAbstract3DSeries *> &seriesList);
84 virtual void updateCustomData(const QList<QCustom3DItem *> &customItems);
85 virtual void updateCustomItems();
86 virtual void updateCustomItemPositions();
87 virtual SeriesRenderCache *createNewCache(QAbstract3DSeries *series);
88 virtual void cleanCache(SeriesRenderCache *cache);
89 virtual void render(GLuint defaultFboHandle);
90
91 virtual void updateTheme(Q3DTheme *theme);
92 virtual void updateSelectionMode(QAbstract3DGraph::SelectionFlags newMode);
93 virtual void updateOptimizationHint(QAbstract3DGraph::OptimizationHints hint);
94 virtual void updateScene(Q3DScene *scene);
95 virtual void updateTextures();
96 virtual void initSelectionBuffer() = 0;
97 virtual void updateSelectionState(SelectionState state);
98
99 virtual void updateDepthBuffer() = 0;
100 virtual void updateShadowQuality(QAbstract3DGraph::ShadowQuality quality) = 0;
101 virtual void initShaders(const QString &vertexShader, const QString &fragmentShader) = 0;
102 virtual void initGradientShaders(const QString &vertexShader, const QString &fragmentShader);
103 virtual void initStaticSelectedItemShaders(const QString &vertexShader,
104 const QString &fragmentShader,
105 const QString &gradientVertexShader,
106 const QString &gradientFragmentShader);
107 virtual void initBackgroundShaders(const QString &vertexShader,
108 const QString &fragmentShader) = 0;
109 virtual void initCustomItemShaders(const QString &vertexShader,
110 const QString &fragmentShader);
111 virtual void initVolumeTextureShaders(const QString &vertexShader,
112 const QString &fragmentShader,
113 const QString &fragmentLowDefShader,
114 const QString &sliceShader,
115 const QString &sliceFrameVertexShader,
116 const QString &sliceFrameShader);
117 virtual void initLabelShaders(const QString &vertexShader, const QString &fragmentShader);
118 virtual void initCursorPositionShaders(const QString &vertexShader,
119 const QString &fragmentShader);
120 virtual void initCursorPositionBuffer();
121
122 virtual void updateAxisType(QAbstract3DAxis::AxisOrientation orientation,
123 QAbstract3DAxis::AxisType type);
124 virtual void updateAxisTitle(QAbstract3DAxis::AxisOrientation orientation,
125 const QString &title);
126 virtual void updateAxisLabels(QAbstract3DAxis::AxisOrientation orientation,
127 const QStringList &labels);
128 virtual void updateAxisRange(QAbstract3DAxis::AxisOrientation orientation, float min,
129 float max);
130 virtual void updateAxisSegmentCount(QAbstract3DAxis::AxisOrientation orientation, int count);
131 virtual void updateAxisSubSegmentCount(QAbstract3DAxis::AxisOrientation orientation,
132 int count);
133 virtual void updateAxisLabelFormat(QAbstract3DAxis::AxisOrientation orientation,
134 const QString &format);
135 virtual void updateAxisReversed(QAbstract3DAxis::AxisOrientation orientation,
136 bool enable);
137 virtual void updateAxisFormatter(QAbstract3DAxis::AxisOrientation orientation,
138 QValue3DAxisFormatter *formatter);
139 virtual void updateAxisLabelAutoRotation(QAbstract3DAxis::AxisOrientation orientation,
140 float angle);
141 virtual void updateAxisTitleVisibility(QAbstract3DAxis::AxisOrientation orientation,
142 bool visible);
143 virtual void updateAxisTitleFixed(QAbstract3DAxis::AxisOrientation orientation,
144 bool fixed);
145 virtual void modifiedSeriesList(const QVector<QAbstract3DSeries *> &seriesList);
146
147 virtual void fixMeshFileName(QString &fileName, QAbstract3DSeries::Mesh mesh);
148
149 virtual CustomRenderItem *addCustomItem(QCustom3DItem *item);
150 virtual void updateCustomItem(CustomRenderItem *renderItem);
151
152 virtual void updateAspectRatio(float ratio);
153 virtual void updateHorizontalAspectRatio(float ratio);
154 virtual void updatePolar(bool enable);
155 virtual void updateRadialLabelOffset(float offset);
156 virtual void updateMargin(float margin);
157
158 virtual QVector3D convertPositionToTranslation(const QVector3D &position,
159 bool isAbsolute) = 0;
160
161 void generateBaseColorTexture(const QColor &color, GLuint *texture);
162 void fixGradientAndGenerateTexture(QLinearGradient *gradient, GLuint *gradientTexture);
163
164 inline bool isClickQueryResolved() const { return m_clickResolved; }
165 inline void clearClickQueryResolved() { m_clickResolved = false; }
166 inline QPoint cachedClickQuery() const { return m_cachedScene->selectionQueryPosition(); }
167 inline QAbstract3DSeries *clickedSeries() const { return m_clickedSeries; }
168 inline QAbstract3DGraph::ElementType clickedType() { return m_clickedType; }
169 inline bool isGraphPositionQueryResolved() const { return m_graphPositionQueryResolved; }
170 inline void clearGraphPositionQueryResolved() { m_graphPositionQueryResolved = false; }
171 inline QVector3D queriedGraphPosition() const { return m_queriedGraphPosition; }
172 inline QPoint cachedGraphPositionQuery() const { return m_cachedScene->graphPositionQuery(); }
173
174 LabelItem &selectionLabelItem();
175 void setSelectionLabel(const QString &label);
176 QString &selectionLabel();
177
178 void drawCustomItems(RenderingState state, ShaderHelper *regularShader,
179 const QMatrix4x4 &viewMatrix,
180 const QMatrix4x4 &projectionViewMatrix,
181 const QMatrix4x4 &depthProjectionViewMatrix,
182 GLuint depthTexture, GLfloat shadowQuality, GLfloat reflection = 1.0f);
183
184 QVector4D indexToSelectionColor(GLint index);
185 void calculatePolarXZ(const QVector3D &dataPos, float &x, float &z) const;
186
187Q_SIGNALS:
188 void needRender(); // Emit this if something in renderer causes need for another render pass.
189 void requestShadowQuality(QAbstract3DGraph::ShadowQuality quality); // For automatic quality adjustments
190
191protected:
192 Abstract3DRenderer(Abstract3DController *controller);
193
194 virtual void contextCleanup();
195 virtual void initializeOpenGL();
196
197 void reInitShaders();
198 virtual void handleShadowQualityChange();
199 virtual void handleResize();
200
201 AxisRenderCache &axisCacheForOrientation(QAbstract3DAxis::AxisOrientation orientation);
202
203 virtual void lowerShadowQuality();
204
205 void fixGradient(QLinearGradient *gradient, GLuint *gradientTexture);
206
207 void calculateZoomLevel();
208 void drawAxisTitleY(const QVector3D &sideLabelRotation, const QVector3D &backLabelRotation,
209 const QVector3D &sideLabelTrans, const QVector3D &backLabelTrans,
210 const QQuaternion &totalSideRotation, const QQuaternion &totalBackRotation,
211 AbstractRenderItem &dummyItem, const Q3DCamera *activeCamera,
212 float labelsMaxWidth,
213 const QMatrix4x4 &viewMatrix, const QMatrix4x4 &projectionMatrix,
214 ShaderHelper *shader);
215 void drawAxisTitleX(const QVector3D &labelRotation, const QVector3D &labelTrans,
216 const QQuaternion &totalRotation, AbstractRenderItem &dummyItem,
217 const Q3DCamera *activeCamera, float labelsMaxWidth,
218 const QMatrix4x4 &viewMatrix, const QMatrix4x4 &projectionMatrix,
219 ShaderHelper *shader, bool radial = false);
220 void drawAxisTitleZ(const QVector3D &labelRotation, const QVector3D &labelTrans,
221 const QQuaternion &totalRotation, AbstractRenderItem &dummyItem,
222 const Q3DCamera *activeCamera, float labelsMaxWidth,
223 const QMatrix4x4 &viewMatrix, const QMatrix4x4 &projectionMatrix,
224 ShaderHelper *shader);
225
226 void loadGridLineMesh();
227 void loadLabelMesh();
228 void loadPositionMapperMesh();
229
230 void drawRadialGrid(ShaderHelper *shader, float yFloorLinePos,
231 const QMatrix4x4 &projectionViewMatrix, const QMatrix4x4 &depthMatrix);
232 void drawAngularGrid(ShaderHelper *shader, float yFloorLinePos,
233 const QMatrix4x4 &projectionViewMatrix, const QMatrix4x4 &depthMatrix);
234
235 float calculatePolarBackgroundMargin();
236 virtual void fixCameraTarget(QVector3D &target) = 0;
237 void updateCameraViewport();
238
239 void recalculateCustomItemScalingAndPos(CustomRenderItem *item);
240 virtual void getVisibleItemBounds(QVector3D &minBounds, QVector3D &maxBounds) = 0;
241 void drawVolumeSliceFrame(const CustomRenderItem *item, Qt::Axis axis,
242 const QMatrix4x4 &projectionViewMatrix);
243 void queriedGraphPosition(const QMatrix4x4 &projectionViewMatrix, const QVector3D &scaling,
244 GLuint defaultFboHandle);
245
246 bool m_hasNegativeValues;
247 Q3DTheme *m_cachedTheme;
248 Drawer *m_drawer;
249 QRect m_viewport;
250 QAbstract3DGraph::ShadowQuality m_cachedShadowQuality;
251 GLfloat m_autoScaleAdjustment;
252
253 QAbstract3DGraph::SelectionFlags m_cachedSelectionMode;
254 QAbstract3DGraph::OptimizationHints m_cachedOptimizationHint;
255
256 AxisRenderCache m_axisCacheX;
257 AxisRenderCache m_axisCacheY;
258 AxisRenderCache m_axisCacheZ;
259 TextureHelper *m_textureHelper;
260 GLuint m_depthTexture;
261
262 Q3DScene *m_cachedScene;
263 bool m_selectionDirty;
264 SelectionState m_selectionState;
265 QPoint m_inputPosition;
266 QHash<QAbstract3DSeries *, SeriesRenderCache *> m_renderCacheList;
267 CustomRenderItemArray m_customRenderCache;
268 QList<QCustom3DItem *> m_customItemDrawOrder;
269 QRect m_primarySubViewport;
270 QRect m_secondarySubViewport;
271 float m_devicePixelRatio;
272 bool m_selectionLabelDirty;
273 bool m_clickResolved;
274 bool m_graphPositionQueryPending;
275 bool m_graphPositionQueryResolved;
276 QAbstract3DSeries *m_clickedSeries;
277 QAbstract3DGraph::ElementType m_clickedType;
278 int m_selectedLabelIndex;
279 int m_selectedCustomItemIndex;
280 QVector3D m_queriedGraphPosition;
281 QPoint m_graphPositionQuery;
282
283 QString m_selectionLabel;
284 LabelItem *m_selectionLabelItem;
285 int m_visibleSeriesCount;
286
287 ShaderHelper *m_customItemShader;
288 ShaderHelper *m_volumeTextureShader;
289 ShaderHelper *m_volumeTextureLowDefShader;
290 ShaderHelper *m_volumeTextureSliceShader;
291 ShaderHelper *m_volumeSliceFrameShader;
292 ShaderHelper *m_labelShader;
293 ShaderHelper *m_cursorPositionShader;
294 GLuint m_cursorPositionFrameBuffer;
295 GLuint m_cursorPositionTexture;
296
297 bool m_useOrthoProjection;
298 bool m_xFlipped;
299 bool m_yFlipped;
300 bool m_zFlipped;
301 bool m_yFlippedForGrid;
302
303 ObjectHelper *m_backgroundObj; // Shared reference
304 ObjectHelper *m_gridLineObj; // Shared reference
305 ObjectHelper *m_labelObj; // Shared reference
306 ObjectHelper *m_positionMapperObj; // Shared reference
307
308 float m_graphAspectRatio;
309 float m_graphHorizontalAspectRatio;
310 bool m_polarGraph;
311 float m_radialLabelOffset;
312 float m_polarRadius;
313
314 QQuaternion m_xRightAngleRotation;
315 QQuaternion m_yRightAngleRotation;
316 QQuaternion m_zRightAngleRotation;
317 QQuaternion m_xRightAngleRotationNeg;
318 QQuaternion m_yRightAngleRotationNeg;
319 QQuaternion m_zRightAngleRotationNeg;
320 QQuaternion m_xFlipRotation;
321 QQuaternion m_zFlipRotation;
322
323 float m_requestedMargin;
324 float m_vBackgroundMargin;
325 float m_hBackgroundMargin;
326 float m_scaleXWithBackground;
327 float m_scaleYWithBackground;
328 float m_scaleZWithBackground;
329
330 QVector3D m_oldCameraTarget;
331
332 bool m_reflectionEnabled;
333 qreal m_reflectivity;
334
335 QLocale m_locale;
336#if !defined(QT_OPENGL_ES_2)
337 QOpenGLFunctions_2_1 *m_funcs_2_1; // Not owned
338#endif
339 QPointer<QOpenGLContext> m_context; // Not owned
340 bool m_isOpenGLES;
341
342private:
343 friend class Abstract3DController;
344};
345
346QT_END_NAMESPACE_DATAVISUALIZATION
347
348#endif
349

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