Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgsmeshlayerrenderer.h 3 : : ---------------------- 4 : : begin : April 2018 5 : : copyright : (C) 2018 by Peter Petrik 6 : : email : zilolv at gmail dot com 7 : : ***************************************************************************/ 8 : : 9 : : /*************************************************************************** 10 : : * * 11 : : * This program is free software; you can redistribute it and/or modify * 12 : : * it under the terms of the GNU General Public License as published by * 13 : : * the Free Software Foundation; either version 2 of the License, or * 14 : : * (at your option) any later version. * 15 : : * * 16 : : ***************************************************************************/ 17 : : 18 : : #ifndef QGSMESHLAYERRENDERER_H 19 : : #define QGSMESHLAYERRENDERER_H 20 : : 21 : : class QgsMeshLayer; 22 : : 23 : : #define SIP_NO_FILE 24 : : 25 : : #include <memory> 26 : : #include <limits> 27 : : 28 : : #include "qgis.h" 29 : : 30 : : #include "qgsmaplayerrenderer.h" 31 : : #include "qgsrasterinterface.h" 32 : : #include "qgstriangularmesh.h" 33 : : #include "qgsmeshlayer.h" 34 : : #include "qgssymbol.h" 35 : : #include "qgsmeshdataprovider.h" 36 : : #include "qgsmeshtracerenderer.h" 37 : : #include "qgsmapclippingregion.h" 38 : : 39 : : class QgsRenderContext; 40 : : 41 : : ///@cond PRIVATE 42 : : 43 : : /** 44 : : * Feedback for mesh layer rendering - right now derived from raster block feedback so that we 45 : : * can pass it to block reading in the raster interface. 46 : : */ 47 : 0 : class QgsMeshLayerRendererFeedback : public QgsRasterBlockFeedback 48 : : { 49 : : Q_OBJECT 50 : : }; 51 : : 52 : : 53 : : /** 54 : : * Cache for data needed to render active datasets 55 : : */ 56 : 0 : struct CORE_NO_EXPORT QgsMeshLayerRendererCache 57 : : { 58 : 0 : int mDatasetGroupsCount = 0; 59 : : 60 : : // scalar dataset 61 : : QgsMeshDatasetIndex mActiveScalarDatasetIndex; 62 : : QVector<double> mScalarDatasetValues; 63 : : QgsMeshDataBlock mScalarActiveFaceFlagValues; 64 : 0 : QgsMeshDatasetGroupMetadata::DataType mScalarDataType = QgsMeshDatasetGroupMetadata::DataType::DataOnVertices; 65 : 0 : double mScalarDatasetMinimum = std::numeric_limits<double>::quiet_NaN(); 66 : 0 : double mScalarDatasetMaximum = std::numeric_limits<double>::quiet_NaN(); 67 : 0 : QgsMeshRendererScalarSettings::DataResamplingMethod mDataInterpolationMethod = QgsMeshRendererScalarSettings::None; 68 : : std::unique_ptr<QgsMesh3dAveragingMethod> mScalarAveragingMethod; 69 : : 70 : : // vector dataset 71 : : QgsMeshDatasetIndex mActiveVectorDatasetIndex; 72 : : QgsMeshDataBlock mVectorDatasetValues; 73 : : QVector<double> mVectorDatasetValuesMag; 74 : 0 : double mVectorDatasetMagMinimum = std::numeric_limits<double>::quiet_NaN(); 75 : 0 : double mVectorDatasetMagMaximum = std::numeric_limits<double>::quiet_NaN(); 76 : 0 : double mVectorDatasetGroupMagMinimum = std::numeric_limits<double>::quiet_NaN(); 77 : 0 : double mVectorDatasetGroupMagMaximum = std::numeric_limits<double>::quiet_NaN(); 78 : 0 : QgsMeshDatasetGroupMetadata::DataType mVectorDataType = QgsMeshDatasetGroupMetadata::DataType::DataOnVertices; 79 : : std::unique_ptr<QgsMesh3dAveragingMethod> mVectorAveragingMethod; 80 : : }; 81 : : 82 : : 83 : : ///@endcond 84 : : 85 : : /** 86 : : * \ingroup core 87 : : * \brief Implementation of threaded rendering for mesh layers. 88 : : * 89 : : * \note not available in Python bindings 90 : : * \since QGIS 3.2 91 : : */ 92 : : class QgsMeshLayerRenderer : public QgsMapLayerRenderer 93 : : { 94 : : public: 95 : : //! Ctor 96 : : QgsMeshLayerRenderer( QgsMeshLayer *layer, QgsRenderContext &context ); 97 : 0 : ~QgsMeshLayerRenderer() override = default; 98 : : QgsFeedback *feedback() const override; 99 : : bool render() override; 100 : : bool forceRasterRender() const override; 101 : : 102 : : private: 103 : : void renderMesh(); 104 : : void renderEdgeMesh( const QgsMeshRendererMeshSettings &settings, const QList<int> &edgesInExtent ); 105 : : void renderFaceMesh( const QgsMeshRendererMeshSettings &settings, const QVector<QgsMeshFace> &faces, const QList<int> &facesInExtent ); 106 : : void renderScalarDataset(); 107 : : void renderScalarDatasetOnEdges( const QgsMeshRendererScalarSettings &scalarSettings ); 108 : : void renderScalarDatasetOnFaces( const QgsMeshRendererScalarSettings &scalarSettings ); 109 : : 110 : : void renderVectorDataset(); 111 : : void copyTriangularMeshes( QgsMeshLayer *layer, QgsRenderContext &context ); 112 : : void copyScalarDatasetValues( QgsMeshLayer *layer ); 113 : : void copyVectorDatasetValues( QgsMeshLayer *layer ); 114 : : void calculateOutputSize(); 115 : : QgsPointXY fractionPoint( const QgsPointXY &p1, const QgsPointXY &p2, double fraction ) const; 116 : : bool mIsMeshSimplificationActive = false; 117 : : QColor colorAt( QgsColorRampShader *shader, double val ) const; 118 : : 119 : : protected: 120 : : //! feedback class for cancellation 121 : : std::unique_ptr<QgsMeshLayerRendererFeedback> mFeedback; 122 : : 123 : : // copy from mesh layer 124 : : QgsMesh mNativeMesh; 125 : : 126 : : // copy from mesh layer 127 : : QgsTriangularMesh mTriangularMesh; 128 : : 129 : : // copy from mesh layer 130 : : QgsRectangle mLayerExtent; 131 : : 132 : : // copy of the scalar dataset 133 : : QVector<double> mScalarDatasetValues; 134 : : QgsMeshDataBlock mScalarActiveFaceFlagValues; 135 : : QgsMeshDatasetGroupMetadata::DataType mScalarDataType = QgsMeshDatasetGroupMetadata::DataOnVertices; 136 : : double mScalarDatasetMinimum = std::numeric_limits<double>::quiet_NaN(); 137 : : double mScalarDatasetMaximum = std::numeric_limits<double>::quiet_NaN(); 138 : : 139 : : // copy of the vector dataset 140 : : QgsMeshDataBlock mVectorDatasetValues; 141 : : QVector<double> mVectorDatasetValuesMag; 142 : : double mVectorDatasetMagMinimum = std::numeric_limits<double>::quiet_NaN(); 143 : : double mVectorDatasetMagMaximum = std::numeric_limits<double>::quiet_NaN(); 144 : : double mVectorDatasetGroupMagMinimum = std::numeric_limits<double>::quiet_NaN(); 145 : : double mVectorDatasetGroupMagMaximum = std::numeric_limits<double>::quiet_NaN(); 146 : : QgsMeshDatasetGroupMetadata::DataType mVectorDataType = QgsMeshDatasetGroupMetadata::DataOnVertices; 147 : : 148 : : // copy of rendering settings 149 : : QgsMeshRendererSettings mRendererSettings; 150 : : 151 : : QList< QgsMapClippingRegion > mClippingRegions; 152 : : 153 : : // output screen size 154 : : QSize mOutputSize; 155 : : 156 : : private: 157 : : 158 : : double mLayerOpacity = 1.0; 159 : : }; 160 : : 161 : : 162 : : #endif // QGSMESHLAYERRENDERER_H