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 48 QT_BEGIN_NAMESPACE_DATAVISUALIZATION 49 50 class ShaderHelper; 51 class Q3DScene; 52 53 class QT_DATAVISUALIZATION_EXPORT Surface3DRenderer : public Abstract3DRenderer 54 { 55 Q_OBJECT 56 57 private: 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 91 public: 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); clickedPosition()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 118 protected: 119 void contextCleanup(); 120 void initializeOpenGL(); 121 virtual void fixCameraTarget(QVector3D &target); 122 virtual void getVisibleItemBounds(QVector3D &minBounds, QVector3D &maxBounds); 123 124 Q_SIGNALS: 125 void flatShadingSupportedChanged(bool supported); 126 127 private: 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 167 QT_END_NAMESPACE_DATAVISUALIZATION 168 169 #endif 170