21 #include <QLinearGradient> 
   50   , mIsEditable( layer->isEditable() )
 
   51   , mFeedback( new QgsMeshLayerRendererFeedback )
 
   52   , mRendererSettings( layer->rendererSettings() )
 
   53   , mLayerOpacity( layer->opacity() )
 
   72   copyTriangularMeshes( layer, context );
 
   75   copyScalarDatasetValues( layer );
 
   76   copyVectorDatasetValues( layer );
 
   78   calculateOutputSize();
 
   91     mIsMeshSimplificationActive = 
true;
 
  104 void QgsMeshLayerRenderer::calculateOutputSize()
 
  110   const QgsRectangle screenBBox = QgsMeshLayerUtils::boundingBoxToScreenRectangle( mapToPixel, extent );
 
  111   const int width = int( screenBBox.
width() );
 
  112   const int height = int( screenBBox.
height() );
 
  116 void QgsMeshLayerRenderer::copyScalarDatasetValues( 
QgsMeshLayer *layer )
 
  128   if ( ( cache->mDatasetGroupsCount == datasetGroupCount ) &&
 
  129        ( cache->mActiveScalarDatasetIndex == datasetIndex ) &&
 
  130        ( cache->mDataInterpolationMethod ==  method ) &&
 
  175       if ( 
mScalarDataType == QgsMeshDatasetGroupMetadata::DataType::DataOnFaces )
 
  177         mScalarDataType = QgsMeshDatasetGroupMetadata::DataType::DataOnVertices;
 
  186       else if ( 
mScalarDataType == QgsMeshDatasetGroupMetadata::DataType::DataOnVertices )
 
  205   cache->mDatasetGroupsCount = datasetGroupCount;
 
  206   cache->mActiveScalarDatasetIndex = datasetIndex;
 
  207   cache->mDataInterpolationMethod = method;
 
  217 void QgsMeshLayerRenderer::copyVectorDatasetValues( 
QgsMeshLayer *layer )
 
  228   if ( ( cache->mDatasetGroupsCount == datasetGroupCount ) &&
 
  229        ( cache->mActiveVectorDatasetIndex == datasetIndex ) &&
 
  248     const bool isScalar = metadata.
isScalar();
 
  251       QgsDebugMsg( QStringLiteral( 
"Dataset has no vector values" ) );
 
  279   cache->mDatasetGroupsCount = datasetGroupCount;
 
  280   cache->mActiveVectorDatasetIndex = datasetIndex;
 
  297     bool needsPainterClipPath = 
false;
 
  299     if ( needsPainterClipPath )
 
  303   renderScalarDataset();
 
  306   renderVectorDataset();
 
  316 void QgsMeshLayerRenderer::renderMesh()
 
  343       nativeFacesInExtent.values() );
 
  357   QPainter *painter = context.
painter();
 
  362   QPen pen = painter->pen();
 
  363   pen.setCapStyle( Qt::FlatCap );
 
  364   pen.setJoinStyle( Qt::MiterJoin );
 
  367   pen.setWidthF( penWidth );
 
  368   pen.setColor( settings.
color() );
 
  369   painter->setPen( pen );
 
  381   QPainter *painter = _painterForMeshFrame( context, settings );
 
  386   for ( 
const int i : edgesInExtent )
 
  391     if ( i >= edges.size() )
 
  395     const int startVertexIndex = edge.first;
 
  396     const int endVertexIndex = edge.second;
 
  398     if ( ( startVertexIndex >= vertices.size() ) || endVertexIndex >= vertices.size() )
 
  401     const QgsMeshVertex &startVertex = vertices[startVertexIndex];
 
  410 void QgsMeshLayerRenderer::renderFaceMesh(
 
  412   const QVector<QgsMeshFace> &faces,
 
  413   const QList<int> &facesInExtent )
 
  415   Q_ASSERT( settings.
isEnabled() || mIsEditable );
 
  421   QPainter *painter = _painterForMeshFrame( context, settings );
 
  424   QSet<QPair<int, int>> drawnEdges;
 
  426   for ( 
const int i : facesInExtent )
 
  431     if ( i >= faces.count() )
 
  435     if ( face.size() < 2 )
 
  438     for ( 
int j = 0; j < face.size(); ++j )
 
  440       const int startVertexId = face[j];
 
  441       const int endVertexId = face[( j + 1 ) % face.size()];
 
  442       const QPair<int, int> thisEdge( startVertexId, endVertexId );
 
  443       const QPair<int, int> thisEdgeReversed( endVertexId, startVertexId );
 
  444       if ( drawnEdges.contains( thisEdge ) || drawnEdges.contains( thisEdgeReversed ) )
 
  446       drawnEdges.insert( thisEdge );
 
  447       drawnEdges.insert( thisEdgeReversed );
 
  460 void QgsMeshLayerRenderer::renderScalarDataset()
 
  469   if ( groupIndex < 0 )
 
  475        ( 
mScalarDataType != QgsMeshDatasetGroupMetadata::DataType::DataOnEdges ) )
 
  477     renderScalarDatasetOnFaces( scalarSettings );
 
  481        ( 
mScalarDataType != QgsMeshDatasetGroupMetadata::DataType::DataOnFaces ) )
 
  483     renderScalarDatasetOnEdges( scalarSettings );
 
  501   for ( 
const int i : egdesInExtent )
 
  506     if ( i >= edges.size() )
 
  510     const int startVertexIndex = edge.first;
 
  511     const int endVertexIndex = edge.second;
 
  513     if ( ( startVertexIndex >= vertices.size() ) || endVertexIndex >= vertices.size() )
 
  516     const QgsMeshVertex &startVertex = vertices[startVertexIndex];
 
  519     if ( 
mScalarDataType == QgsMeshDatasetGroupMetadata::DataType::DataOnEdges )
 
  533   if ( shader->
shade( val, &r, &g, &b, &a ) )
 
  535     return QColor( r, g, b, a );
 
  542   const QgsPointXY pt( p1.
x() + fraction * ( p2.
x() - p1.
x() ),
 
  543                        p1.
y() + fraction * ( p2.
y() - p1.
y() ) );
 
  560   interpolator.setSpatialIndexActive( mIsMeshSimplificationActive );
 
  564   renderer.setOpacity( scalarSettings.
opacity() );
 
  567   const QImage img = bl->image();
 
  569   context.
painter()->drawImage( 0, 0, img );
 
  572 void QgsMeshLayerRenderer::renderVectorDataset()
 
  575   if ( groupIndex < 0 )
 
  587   std::unique_ptr<QgsMeshVectorRenderer> renderer( QgsMeshVectorRenderer::makeVectorRenderer(
 
@ UseAdvancedEffects
Enable layer opacity and blending effects.
A ramp shader will color a raster pixel based on a list of values ranges in a ramp.
bool shade(double value, int *returnRedValue, int *returnGreenValue, int *returnBlueValue, int *returnAlphaValue) const override
Generates and new RGB value based on one input value.
Base class for feedback objects to be used for cancellation of something running in a worker thread.
Class defining color to render mesh datasets.
Represents a simple line renderer with width and color varying depending on values.
void setInterpolatedColor(const QgsInterpolatedLineColor &strokeColoring)
Sets the stroke color used to render.
void setInterpolatedWidth(const QgsInterpolatedLineWidth &strokeWidth)
Sets the stroke width used to render.
void render(double value1, double value2, const QgsPointXY &point1, const QgsPointXY &point2, QgsRenderContext &context) const
Renders a line in the context between point1 and point2 with color and width that vary depending on v...
void setWidthUnit(QgsUnitTypes::RenderUnit strokeWidthUnit)
Sets the unit of the stroke width.
Represents a width than can vary depending on values.
static QList< QgsMapClippingRegion > collectClippingRegionsForLayer(const QgsRenderContext &context, const QgsMapLayer *layer)
Collects the list of map clipping regions from a context which apply to a map layer.
static QPainterPath calculatePainterClipRegion(const QList< QgsMapClippingRegion > ®ions, const QgsRenderContext &context, QgsMapLayerType layerType, bool &shouldClip)
Returns a QPainterPath representing the intersection of clipping regions from context which should be...
Base class for utility classes that encapsulate information necessary for rendering of map layers.
bool mReadyToCompose
The flag must be set to false in renderer's constructor if wants to use the smarter map redraws funct...
QgsRenderContext * renderContext()
Returns the render context associated with the renderer.
Perform transforms between map coordinates and device coordinates.
double mapUnitsPerPixel() const
Returns the current map units per pixel.
QgsPointXY transform(const QgsPointXY &p) const
Transforms a point p from map (world) coordinates to device coordinates.
virtual QgsMesh3dAveragingMethod * clone() const =0
Clone the instance.
static bool equals(const QgsMesh3dAveragingMethod *a, const QgsMesh3dAveragingMethod *b)
Returns whether two methods equal.
QgsMeshDataBlock is a block of integers/doubles that can be used to retrieve: active flags (e....
bool isValid() const
Whether the block is valid.
QgsMeshDatasetIndex is index that identifies the dataset group (e.g.
bool isValid() const
Returns whether index is valid, ie at least groups is set.
int group() const
Returns a group index.
double mScalarDatasetMaximum
QgsMeshDatasetGroupMetadata::DataType mScalarDataType
double mVectorDatasetMagMinimum
double mScalarDatasetMinimum
QgsTriangularMesh mTriangularMesh
QgsMeshLayerRenderer(QgsMeshLayer *layer, QgsRenderContext &context)
Ctor.
QVector< double > mScalarDatasetValues
std::unique_ptr< QgsMeshLayerRendererFeedback > mFeedback
feedback class for cancellation
QgsMeshDataBlock mScalarActiveFaceFlagValues
bool render() override
Do the rendering (based on data stored in the class).
double mVectorDatasetMagMaximum
QgsRectangle mLayerExtent
QVector< double > mVectorDatasetValuesMag
double mVectorDatasetGroupMagMaximum
QgsMeshRendererSettings mRendererSettings
bool forceRasterRender() const override
Returns true if the renderer must be rendered to a raster paint device (e.g.
QgsMeshDatasetGroupMetadata::DataType mVectorDataType
double mVectorDatasetGroupMagMinimum
QList< QgsMapClippingRegion > mClippingRegions
QgsFeedback * feedback() const override
Access to feedback object of the layer renderer (may be nullptr)
QgsMeshDataBlock mVectorDatasetValues
Represents a mesh layer supporting display of data on structured or unstructured meshes.
QgsRectangle extent() const override
Returns the extent of the layer.
int datasetGroupCount() const
Returns the dataset groups count handle by the layer.
QgsMeshDatasetIndex activeScalarDatasetAtTime(const QgsDateTimeRange &timeRange) const
Returns dataset index from active scalar group depending on the time range.
QgsMesh * nativeMesh()
Returns native mesh (nullptr before rendering or calling to updateMesh)
QgsMeshDatasetIndex staticVectorDatasetIndex() const
Returns the static vector dataset index that is rendered if the temporal properties is not active.
QgsMeshSimplificationSettings meshSimplificationSettings() const
Returns mesh simplification settings.
QgsMeshDatasetIndex activeVectorDatasetAtTime(const QgsDateTimeRange &timeRange) const
Returns dataset index from active vector group depending on the time range If the temporal properties...
QgsMeshDataBlock areFacesActive(const QgsMeshDatasetIndex &index, int faceIndex, int count) const
Returns whether the faces are active for particular dataset.
QgsMeshDatasetIndex staticScalarDatasetIndex() const
Returns the static scalar dataset index that is rendered if the temporal properties is not active.
QgsMeshDatasetMetadata datasetMetadata(const QgsMeshDatasetIndex &index) const
Returns the dataset metadata.
QgsMeshDataProvider * dataProvider() override
Returns the layer's data provider, it may be nullptr.
QgsTriangularMesh * triangularMesh(double minimumTriangleSize=0) const
Returns triangular mesh (nullptr before rendering or calling to updateMesh).
QgsMeshDatasetGroupMetadata datasetGroupMetadata(const QgsMeshDatasetIndex &index) const
Returns the dataset groups metadata.
QgsMeshLayerRendererCache * rendererCache()
Returns native mesh (nullptr before rendering)
Represents a mesh renderer settings for mesh object.
QColor color() const
Returns color used for rendering.
QgsUnitTypes::RenderUnit lineWidthUnit() const
Returns units of the width of the mesh frame.
double lineWidth() const
Returns line width used for rendering (in millimeters)
bool isEnabled() const
Returns whether mesh structure rendering is enabled.
Represents a mesh renderer settings for scalar datasets.
double opacity() const
Returns opacity.
QgsColorRampShader colorRampShader() const
Returns color ramp shader function.
double classificationMinimum() const
Returns min value used for creation of the color ramp shader.
DataResamplingMethod
Resampling of value from dataset.
@ None
Does not use resampling.
DataResamplingMethod dataResamplingMethod() const
Returns the type of interpolation to use to convert face defined datasets to values on vertices.
double classificationMaximum() const
Returns max value used for creation of the color ramp shader.
QgsUnitTypes::RenderUnit edgeStrokeWidthUnit() const
Returns the stroke width unit used to render edges scalar dataset.
QgsInterpolatedLineWidth edgeStrokeWidth() const
Returns the stroke width used to render edges scalar dataset.
QgsMeshRendererScalarSettings scalarSettings(int groupIndex) const
Returns renderer settings.
int activeVectorDatasetGroup() const
Returns the active vector dataset group.
int activeScalarDatasetGroup() const
Returns the active scalar dataset group.
QgsMesh3dAveragingMethod * averagingMethod() const
Returns averaging method for conversion of 3d stacked mesh data to 2d data.
QgsMeshRendererVectorSettings vectorSettings(int groupIndex) const
Returns renderer settings.
QgsMeshRendererMeshSettings edgeMeshSettings() const
Returns edge mesh renderer settings.
QgsMeshRendererMeshSettings nativeMeshSettings() const
Returns native mesh renderer settings.
QgsMeshRendererMeshSettings triangularMeshSettings() const
Returns triangular mesh renderer settings.
Represents an overview renderer settings.
bool isEnabled() const
Returns if the overview is active.
int meshResolution() const
Returns the mesh resolution i.e., the minimum size (average) of triangles in pixels.
A class to represent a 2D point.
QPointF toQPointF() const
Converts a point to a QPointF.
Point geometry type, with support for z-dimension and m-values.
Interface for all raster shaders.
void setRasterShaderFunction(QgsRasterShaderFunction *function)
A public method that allows the user to set their own shader function.
A rectangle specified with double values.
double height() const SIP_HOLDGIL
Returns the height of the rectangle.
double width() const SIP_HOLDGIL
Returns the width of the rectangle.
Contains information about the context of a rendering operation.
QPainter * painter()
Returns the destination QPainter for the render operation.
const QgsMapToPixel & mapToPixel() const
Returns the context's map to pixel transform, which transforms between map coordinates and device coo...
void setPainterFlagsUsingContext(QPainter *painter=nullptr) const
Sets relevant flags on a destination painter, using the flags and settings currently defined for the ...
double convertToPainterUnits(double size, QgsUnitTypes::RenderUnit unit, const QgsMapUnitScale &scale=QgsMapUnitScale(), Qgis::RenderSubcomponentProperty property=Qgis::RenderSubcomponentProperty::Generic) const
Converts a size from the specified units to painter units (pixels).
bool testFlag(Qgis::RenderContextFlag flag) const
Check whether a particular flag is enabled.
QgsRectangle mapExtent() const
Returns the original extent of the map being rendered.
bool renderingStopped() const
Returns true if the rendering operation has been stopped and any ongoing rendering should be canceled...
Scoped object for saving and restoring a QPainter object's state.
Raster renderer pipe for single band pseudocolor.
const QVector< QgsMeshFace > & triangles() const
Returns triangles.
int levelOfDetail() const
Returns the corresponding index of level of detail on which this mesh is associated.
QList< int > edgeIndexesForRectangle(const QgsRectangle &rectangle) const
Finds indexes of edges intersecting given bounding box It uses spatial indexing.
const QVector< QgsMeshVertex > & vertices() const
Returns vertices in map coordinate system.
const QVector< QgsMeshEdge > & edges() const
Returns edges.
bool contains(const QgsMesh::ElementType &type) const
Returns whether the mesh contains mesh elements of given type.
const QVector< int > & trianglesToNativeFaces() const
Returns mapping between triangles and original faces.
const QVector< int > & edgesToNativeEdges() const
Returns mapping between edges and original edges.
QList< int > faceIndexesForRectangle(const QgsRectangle &rectangle) const
Finds indexes of triangles intersecting given bounding box It uses spatial indexing.
CORE_EXPORT QSet< int > nativeEdgesFromEdges(const QList< int > &edgesIndexes, const QVector< int > &edgesToNativeEdges)
Returns unique native faces indexes from list of triangle indexes.
CORE_EXPORT QSet< int > nativeFacesFromTriangles(const QList< int > &triangleIndexes, const QVector< int > &trianglesToNativeFaces)
Returns unique native faces indexes from list of triangle indexes.
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference)
QVector< int > QgsMeshFace
List of vertex indexes.
QPair< int, int > QgsMeshEdge
Edge is a straight line seqment between 2 points.
QVector< QgsMeshFace > faces