1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
3
4//
5// W A R N I N G
6// -------------
7//
8// This file is not part of the QtDataVisualization API. It exists purely as an
9// implementation detail. This header file may change from version to
10// version without notice, or even be removed.
11//
12// We mean it.
13
14#ifndef Q3DBARSRENDERER_P_H
15#define Q3DBARSRENDERER_P_H
16
17#include "datavisualizationglobal_p.h"
18#include "bars3dcontroller_p.h"
19#include "abstract3drenderer_p.h"
20#include "barrenderitem_p.h"
21
22QT_BEGIN_NAMESPACE
23class QPoint;
24class QSizeF;
25QT_END_NAMESPACE
26
27QT_BEGIN_NAMESPACE
28
29class ShaderHelper;
30class LabelItem;
31class Q3DScene;
32class BarSeriesRenderCache;
33
34class Q_DATAVISUALIZATION_EXPORT Bars3DRenderer : public Abstract3DRenderer
35{
36 Q_OBJECT
37
38private:
39 // Cached state based on emitted signals from the controller
40 QSizeF m_cachedBarThickness;
41 QSizeF m_cachedBarSpacing;
42 bool m_cachedIsSlicingActivated;
43 int m_cachedRowCount;
44 int m_cachedColumnCount;
45 QSizeF m_cachedBarSeriesMargin;
46
47 // Internal state
48 BarRenderItem *m_selectedBar; // points to renderitem array
49 AxisRenderCache *m_sliceCache; // not owned
50 const LabelItem *m_sliceTitleItem; // not owned
51 bool m_updateLabels;
52 ShaderHelper *m_barShader;
53 ShaderHelper *m_barGradientShader;
54 ShaderHelper *m_depthShader;
55 ShaderHelper *m_selectionShader;
56 ShaderHelper *m_backgroundShader;
57 GLuint m_bgrTexture;
58 GLuint m_selectionTexture;
59 GLuint m_depthFrameBuffer;
60 GLuint m_selectionFrameBuffer;
61 GLuint m_selectionDepthBuffer;
62 GLfloat m_shadowQualityToShader;
63 GLint m_shadowQualityMultiplier;
64 GLfloat m_heightNormalizer;
65 GLfloat m_gradientFraction;
66 GLfloat m_backgroundAdjustment;
67 GLfloat m_rowWidth;
68 GLfloat m_columnDepth;
69 GLfloat m_maxDimension;
70 GLfloat m_scaleX;
71 GLfloat m_scaleZ;
72 GLfloat m_scaleFactor;
73 GLfloat m_maxSceneSize;
74 QPoint m_visualSelectedBarPos;
75 QPoint m_selectedBarPos;
76 BarSeriesRenderCache *m_selectedSeriesCache;
77 BarRenderItem m_dummyBarRenderItem;
78 bool m_noZeroInRange;
79 float m_seriesScaleX;
80 float m_seriesScaleZ;
81 float m_seriesStep;
82 float m_seriesStart;
83 QPoint m_clickedPosition;
84 bool m_keepSeriesUniform;
85 bool m_haveUniformColorSeries;
86 bool m_haveGradientSeries;
87 float m_zeroPosition;
88 float m_xScaleFactor;
89 float m_zScaleFactor;
90 float m_floorLevel;
91 float m_actualFloorLevel;
92
93public:
94 explicit Bars3DRenderer(Bars3DController *controller);
95 ~Bars3DRenderer();
96
97 void updateData() override;
98 void updateSeries(const QList<QAbstract3DSeries *> &seriesList) override;
99 SeriesRenderCache *createNewCache(QAbstract3DSeries *series) override;
100 void updateRows(const QList<Bars3DController::ChangeRow> &rows);
101 void updateItems(const QList<Bars3DController::ChangeItem> &items);
102 void updateScene(Q3DScene *scene) override;
103 void render(GLuint defaultFboHandle = 0) override;
104
105 QVector3D convertPositionToTranslation(const QVector3D &position, bool isAbsolute) override;
106
107 void updateAspectRatio(float ratio) override;
108 void updateFloorLevel(float level);
109 void updateMargin(float margin) override;
110
111protected:
112 void contextCleanup() override;
113 void initializeOpenGL() override;
114 void fixCameraTarget(QVector3D &target) override;
115 void getVisibleItemBounds(QVector3D &minBounds, QVector3D &maxBounds) override;
116
117public Q_SLOTS:
118 void updateMultiSeriesScaling(bool uniform);
119 void updateBarSpecs(GLfloat thicknessRatio = 1.0f,
120 const QSizeF &spacing = QSizeF(1.0, 1.0),
121 bool relative = true);
122 void updateBarSeriesMargin(const QSizeF &margin);
123 void updateSlicingActive(bool isSlicing);
124 void updateSelectedBar(const QPoint &position, QBar3DSeries *series);
125 inline QPoint clickedPosition() const { return m_clickedPosition; }
126 void resetClickedStatus();
127
128 // Overloaded from abstract renderer
129 void updateAxisRange(QAbstract3DAxis::AxisOrientation orientation, float min,
130 float max) override;
131 void updateAxisReversed(QAbstract3DAxis::AxisOrientation orientation,
132 bool enable) override;
133
134private:
135 void initShaders(const QString &vertexShader, const QString &fragmentShader) override;
136 void initGradientShaders(const QString &vertexShader, const QString &fragmentShader) override;
137 void updateShadowQuality(QAbstract3DGraph::ShadowQuality quality) override;
138 void updateTextures() override;
139 void fixMeshFileName(QString &fileName, QAbstract3DSeries::Mesh mesh) override;
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 bool drawBars(BarRenderItem **selectedBar, const QMatrix4x4 &depthProjectionViewMatrix,
147 const QMatrix4x4 &projectionViewMatrix, const QMatrix4x4 &viewMatrix,
148 GLint startRow, GLint stopRow, GLint stepRow,
149 GLint startBar, GLint stopBar, GLint stepBar, GLfloat reflection = 1.0f);
150 void drawBackground(GLfloat backgroundRotation, const QMatrix4x4 &depthProjectionViewMatrix,
151 const QMatrix4x4 &projectionViewMatrix, const QMatrix4x4 &viewMatrix,
152 bool reflectingDraw = false, bool drawingSelectionBuffer = false);
153 void drawGridLines(const QMatrix4x4 &depthProjectionViewMatrix,
154 const QMatrix4x4 &projectionViewMatrix,
155 const QMatrix4x4 &viewMatrix);
156
157 void loadBackgroundMesh();
158 void initSelectionShader();
159 void initBackgroundShaders(const QString &vertexShader, const QString &fragmentShader) override;
160 void initSelectionBuffer() override;
161 void initDepthShader();
162 void updateDepthBuffer() override;
163 void calculateSceneScalingFactors();
164 void calculateHeightAdjustment();
165 void calculateSeriesStartPosition();
166 Abstract3DController::SelectionType isSelected(int row, int bar,
167 const BarSeriesRenderCache *cache);
168 QPoint selectionColorToArrayPosition(const QVector4D &selectionColor);
169 QBar3DSeries *selectionColorToSeries(const QVector4D &selectionColor);
170
171 inline void updateRenderRow(const QBarDataRow *dataRow, BarRenderItemRow &renderRow);
172 inline void updateRenderItem(const QBarDataItem &dataItem, BarRenderItem &renderItem);
173
174 Q_DISABLE_COPY(Bars3DRenderer)
175};
176
177QT_END_NAMESPACE
178
179#endif
180

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