18#include <QElapsedTimer> 
   39#include "qgsvirtualpointcloudprovider.h" 
   41#include <delaunator.hpp> 
   46  , mLayerName( layer->name() )
 
   47  , mLayerAttributes( layer->attributes() )
 
   48  , mSubIndexes( layer->dataProvider() ? layer->dataProvider()->subIndexes() : QVector<QgsPointCloudSubIndex>() )
 
   50  , mEnableProfile( context.flags() & 
Qgis::RenderContextFlag::RecordProfile )
 
   55  mIndex = layer->
index();
 
   61  if ( !mSubIndexes.isEmpty() )
 
   64    mSubIndexExtentRenderer->setShowLabels( mRenderer->showLabels() );
 
   65    mSubIndexExtentRenderer->setLabelTextFormat( mRenderer->labelTextFormat() );
 
   70    mScale = mIndex.
scale();
 
   76    mZOffset = elevationProps->zOffset();
 
   77    mZScale = elevationProps->zScale();
 
   80  if ( 
const QgsVirtualPointCloudProvider *vpcProvider = 
dynamic_cast<QgsVirtualPointCloudProvider *
>( layer->
dataProvider() ) )
 
   83    mAverageSubIndexWidth = vpcProvider->averageSubIndexWidth();
 
   84    mAverageSubIndexHeight = vpcProvider->averageSubIndexHeight();
 
   85    mOverviewIndex = vpcProvider->overview();
 
   94  mPreparationTime = timer.elapsed();
 
 
   99  std::unique_ptr< QgsScopedRuntimeProfile > profile;
 
  100  if ( mEnableProfile )
 
  102    profile = std::make_unique< QgsScopedRuntimeProfile >( mLayerName, QStringLiteral( 
"rendering" ), 
layerId() );
 
  103    if ( mPreparationTime > 0 )
 
  107  std::unique_ptr< QgsScopedRuntimeProfile > preparingProfile;
 
  108  if ( mEnableProfile )
 
  110    preparingProfile = std::make_unique< QgsScopedRuntimeProfile >( QObject::tr( 
"Preparing render" ), QStringLiteral( 
"rendering" ) );
 
  121  if ( !mClippingRegions.empty() )
 
  123    bool needsPainterClipPath = 
false;
 
  125    if ( needsPainterClipPath )
 
  129  if ( mRenderer->type() == QLatin1String( 
"extent" ) )
 
  132    mRenderer->startRender( context );
 
  134    mRenderer->stopRender( context );
 
  139  if ( mSubIndexes.isEmpty() && ( !mIndex || !mIndex.
isValid() ) )
 
  149    mBlockRenderUpdates = 
true;
 
  150    mElapsedTimer.start();
 
  153  mRenderer->startRender( context );
 
  165  QSet< QString > rendererAttributes = mRenderer->usedAttributes( context );
 
  168  for ( 
const QString &attribute : std::as_const( rendererAttributes ) )
 
  170    if ( mAttributes.
indexOf( attribute ) >= 0 )
 
  173    const int layerIndex = mLayerAttributes.
indexOf( attribute );
 
  174    if ( layerIndex < 0 )
 
  176      QgsMessageLog::logMessage( QObject::tr( 
"Required attribute %1 not found in layer" ).arg( attribute ), QObject::tr( 
"Point Cloud" ) );
 
  180    mAttributes.
push_back( mLayerAttributes.
at( layerIndex ) );
 
  190    QgsDebugError( QStringLiteral( 
"Transformation of extent failed!" ) );
 
  193  preparingProfile.reset();
 
  194  std::unique_ptr< QgsScopedRuntimeProfile > renderingProfile;
 
  195  if ( mEnableProfile )
 
  197    renderingProfile = std::make_unique< QgsScopedRuntimeProfile >( QObject::tr( 
"Rendering" ), QStringLiteral( 
"rendering" ) );
 
  200  bool canceled = 
false;
 
  201  if ( mSubIndexes.isEmpty() )
 
  203    canceled = !renderIndex( mIndex );
 
  207    QVector< QgsPointCloudSubIndex > visibleIndexes;
 
  208    for ( 
const QgsPointCloudSubIndex &si : mSubIndexes )
 
  212        visibleIndexes.append( si );
 
  215    const bool zoomedOut = renderExtent.
width() > mAverageSubIndexWidth ||
 
  216                           renderExtent.
height() > mAverageSubIndexHeight;
 
  218    if ( mOverviewIndex && mOverviewIndex->isValid() && zoomedOut &&
 
  221      renderIndex( *mOverviewIndex );
 
  227      if ( mOverviewIndex && mOverviewIndex->isValid() && zoomedOut &&
 
  230        renderIndex( *mOverviewIndex );
 
  232      mSubIndexExtentRenderer->startRender( context );
 
  233      for ( 
const QgsPointCloudSubIndex &si : visibleIndexes )
 
  243          mSubIndexExtentRenderer->renderExtent( si.polygonBounds(), context );
 
  244          if ( mSubIndexExtentRenderer->showLabels() )
 
  246            mSubIndexExtentRenderer->renderLabel(
 
  248              si.uri().section( 
"/", -1 ).section( 
".", 0, 0 ),
 
  255          canceled = !renderIndex( pc );
 
  258      mSubIndexExtentRenderer->stopRender( context );
 
  262  mRenderer->stopRender( context );
 
 
  284  const double maximumError = context.renderContext().convertToPainterUnits( mRenderer->maximumScreenError(), mRenderer->maximumScreenErrorUnit() );
 
  289  if ( !context.renderContext().coordinateTransform().isShortCircuited() )
 
  299      QgsDebugError( QStringLiteral( 
"Could not transform node extent to map CRS" ) );
 
  300      rootNodeExtentMapCoords = rootNodeExtentLayerCoords;
 
  305    rootNodeExtentMapCoords = rootNodeExtentLayerCoords;
 
  308  const double rootErrorInMapCoordinates = rootNodeExtentMapCoords.
width() / pc.
span(); 
 
  310  double mapUnitsPerPixel = context.renderContext().mapToPixel().mapUnitsPerPixel();
 
  311  if ( ( rootErrorInMapCoordinates < 0.0 ) || ( mapUnitsPerPixel < 0.0 ) || ( maximumError < 0.0 ) )
 
  316  double rootErrorPixels = rootErrorInMapCoordinates / mapUnitsPerPixel; 
 
  317  const QVector<QgsPointCloudNodeId> nodes = traverseTree( pc, context.renderContext(), pc.
root(), maximumError, rootErrorPixels );
 
  324  bool canceled = 
false;
 
  327  if ( mRenderer->renderAsTriangles() )
 
  339      nodesDrawn += renderNodesSorted( nodes, pc, context, request, canceled, mRenderer->drawOrder2d() );
 
  348          nodesDrawn += renderNodesSync( nodes, pc, context, request, canceled );
 
  353          nodesDrawn += renderNodesAsync( nodes, pc, context, request, canceled );
 
  361  QgsDebugMsgLevel( QStringLiteral( 
"totals: %1 nodes | %2 points | %3ms" ).arg( nodesDrawn )
 
  362                    .arg( context.pointsRendered() )
 
  363                    .arg( t.elapsed() ), 2 );
 
  390    std::unique_ptr<QgsPointCloudBlock> block( pc.
nodeData( n, request ) );
 
  403    mRenderer->renderBlock( block.get(), context );
 
  419  if ( mRenderer->renderAsTriangles() )
 
  423    renderTriangulatedSurface( context );
 
  445  QVector<QgsPointCloudBlockRequest *> blockRequests;
 
  450  for ( 
int i = 0; i < nodes.size(); ++i )
 
  455    blockRequests.append( blockRequest );
 
  457                      [ 
this, &canceled, &nodesDrawn, &loop, &blockRequests, &context, nStr, blockRequest ]()
 
  459      blockRequests.removeOne( blockRequest );
 
  462      if ( blockRequests.isEmpty() )
 
  465      std::unique_ptr<QgsPointCloudBlock> block( blockRequest->
takeBlock() );
 
  467      blockRequest->deleteLater();
 
  477        QgsDebugError( QStringLiteral( 
"Unable to load node %1, error: %2" ).arg( nStr, blockRequest->
errorStr() ) );
 
  488      mRenderer->renderBlock( block.get(), context );
 
  513    std::unique_ptr<QgsPointCloudBlock> block = blockRequest->
takeBlock();
 
  516    blockRequest->deleteLater();
 
  519  if ( mRenderer->renderAsTriangles() )
 
  523    renderTriangulatedSurface( context );
 
  540  QByteArray allByteArrays;
 
  542  QVector<QPair<int, double>> allPairs;
 
  552    std::unique_ptr<QgsPointCloudBlock> block( pc.
nodeData( n, request ) );
 
  560    if ( blockCount == 0 )
 
  562      blockScale = block->scale();
 
  563      blockOffset = block->offset();
 
  568      offsetDifference = blockOffset - block->offset();
 
  571    const char *ptr = block->data();
 
  579    for ( 
int i = 0; i < block->pointCount(); ++i )
 
  581      allByteArrays.append( ptr + i * recordSize, recordSize );
 
  584      if ( offsetDifference.
x() != 0 )
 
  586        qint32 ix = *
reinterpret_cast< const qint32 * 
>( ptr + i * recordSize + context.
xOffset() );
 
  587        ix -= std::lround( offsetDifference.
x() / context.
scale().
x() );
 
  588        const char *xPtr = 
reinterpret_cast< const char * 
>( &ix );
 
  589        allByteArrays.replace( pointCount * recordSize + context.
xOffset(), 4, QByteArray( xPtr, 4 ) );
 
  591      if ( offsetDifference.
y() != 0 )
 
  593        qint32 iy = *
reinterpret_cast< const qint32 * 
>( ptr + i * recordSize + context.
yOffset() );
 
  594        iy -= std::lround( offsetDifference.
y() / context.
scale().
y() );
 
  595        const char *yPtr = 
reinterpret_cast< const char * 
>( &iy );
 
  596        allByteArrays.replace( pointCount * recordSize + context.
yOffset(), 4, QByteArray( yPtr, 4 ) );
 
  599      qint32 iz = *
reinterpret_cast< const qint32 * 
>( ptr + i * recordSize + context.
zOffset() );
 
  600      if ( offsetDifference.
z() != 0 )
 
  602        iz -= std::lround( offsetDifference.
z() / context.
scale().
z() );
 
  603        const char *zPtr = 
reinterpret_cast< const char * 
>( &iz );
 
  604        allByteArrays.replace( pointCount * recordSize + context.
zOffset(), 4, QByteArray( zPtr, 4 ) );
 
  606      allPairs.append( qMakePair( pointCount, 
double( iz ) + block->offset().z() ) );
 
  613  if ( pointCount == 0 )
 
  619      std::sort( allPairs.begin(), allPairs.end(), []( QPair<int, double> a, QPair<int, double> b ) { return a.second < b.second; } );
 
  622      std::sort( allPairs.begin(), allPairs.end(), []( QPair<int, double> a, QPair<int, double> b ) { return a.second > b.second; } );
 
  629  QByteArray sortedByteArray;
 
  630  sortedByteArray.reserve( allPairs.size() );
 
  631  for ( QPair<int, double> pair : allPairs )
 
  632    sortedByteArray.append( allByteArrays.mid( pair.first * recordSize, recordSize ) );
 
  643  context.
setScale( bigBlock->scale() );
 
  647  mRenderer->renderBlock( bigBlock.get(), context );
 
  655inline bool isEdgeTooLong( 
const QPointF &p1, 
const QPointF &p2, 
float length )
 
  658  return p.x() * p.x() + p.y() * p.y() > length;
 
 
  661static void renderTriangle( QImage &img, QPointF *pts, QRgb c0, QRgb c1, QRgb c2, 
float horizontalFilter, 
float *elev, 
QgsElevationMap *elevationMap )
 
  663  if ( horizontalFilter > 0 )
 
  665    float filterThreshold2 = horizontalFilter * horizontalFilter;
 
  672  QgsRectangle screenBBox = QgsMeshLayerUtils::triangleBoundingBox( pts[0], pts[1], pts[2] );
 
  674  QSize outputSize = img.size();
 
  676  int topLim = std::max( 
int( screenBBox.
yMinimum() ), 0 );
 
  677  int bottomLim = std::min( 
int( screenBBox.
yMaximum() ), outputSize.height() - 1 );
 
  678  int leftLim = std::max( 
int( screenBBox.
xMinimum() ), 0 );
 
  679  int rightLim = std::min( 
int( screenBBox.
xMaximum() ), outputSize.width() - 1 );
 
  681  int red0 = qRed( c0 ), green0 = qGreen( c0 ), blue0 = qBlue( c0 );
 
  682  int red1 = qRed( c1 ), green1 = qGreen( c1 ), blue1 = qBlue( c1 );
 
  683  int red2 = qRed( c2 ), green2 = qGreen( c2 ), blue2 = qBlue( c2 );
 
  687  for ( 
int j = topLim; j <= bottomLim; j++ )
 
  689    QRgb *scanLine = ( QRgb * ) img.scanLine( j );
 
  690    QRgb *elevScanLine = elevData ? elevData + 
static_cast<size_t>( outputSize.width() * j ) : nullptr;
 
  691    for ( 
int k = leftLim; k <= rightLim; k++ )
 
  694      double lam1, lam2, lam3;
 
  695      if ( !QgsMeshLayerUtils::calculateBarycentricCoordinates( pts[0], pts[1], pts[2], pt, lam3, lam2, lam1 ) )
 
  699      int r = 
static_cast<int>( red0 * lam1 + red1 * lam2 + red2 * lam3 );
 
  700      int g = 
static_cast<int>( green0 * lam1 + green1 * lam2 + green2 * lam3 );
 
  701      int b = 
static_cast<int>( blue0 * lam1 + blue1 * lam2 + blue2 * lam3 );
 
  702      scanLine[k] = qRgb( r, g, b );
 
  707        float z = 
static_cast<float>( elev[0] * lam1 + elev[1] * lam2 + elev[2] * lam3 );
 
  717  const std::vector<double> &points = triangulation.
points;
 
  720  if ( points.size() < 3 )
 
  722    QgsDebugMsgLevel( QStringLiteral( 
"Need at least 3 points to triangulate" ), 4 );
 
  726  std::unique_ptr<delaunator::Delaunator> delaunator;
 
  729    delaunator.reset( 
new delaunator::Delaunator( points ) );
 
  731  catch ( std::exception & )
 
  738  float horizontalFilter = 0;
 
  739  if ( mRenderer->horizontalTriangleFilter() )
 
  742        mRenderer->horizontalTriangleFilterThreshold(), mRenderer->horizontalTriangleFilterUnit() ) );
 
  749  const std::vector<size_t> &triangleIndexes = delaunator->triangles;
 
  753  float elev[3] {0, 0, 0};
 
  754  for ( 
size_t i = 0; i < triangleIndexes.size(); i += 3 )
 
  756    size_t v0 = triangleIndexes[i], v1 = triangleIndexes[i + 1], v2 = triangleIndexes[i + 2];
 
  757    triangle[0].rx() = points[v0 * 2];
 
  758    triangle[0].ry() = points[v0 * 2 + 1];
 
  759    triangle[1].rx() = points[v1 * 2];
 
  760    triangle[1].ry() = points[v1 * 2 + 1];
 
  761    triangle[2].rx() = points[v2 * 2];
 
  762    triangle[2].ry() = points[v2 * 2 + 1];
 
  771    QRgb c0 = triangulation.
colors[v0], c1 = triangulation.
colors[v1], c2 = triangulation.
colors[v2];
 
  772    renderTriangle( img, triangle, c0, c1, c2, horizontalFilter, elev, elevationMap );
 
  775  painter->drawImage( 0, 0, img );
 
  783  if ( mRenderer->renderAsTriangles() )
 
 
  793  return mRenderer ? mRenderer->type() != QLatin1String( 
"extent" ) : 
false;
 
 
  798  mRenderTimeHint = time;
 
 
  803  QVector<QgsPointCloudNodeId> nodes;
 
  825  double childrenErrorPixels = nodeErrorPixels / 2.0;
 
  826  if ( childrenErrorPixels < maxErrorPixels )
 
  831    nodes += traverseTree( pc, context, nn, maxErrorPixels, childrenErrorPixels );
 
Provides global constants and enumerations for use throughout the application.
 
QFlags< MapLayerRendererFlag > MapLayerRendererFlags
Flags which control how map layer renderers behave.
 
PointCloudDrawOrder
Pointcloud rendering order for 2d views.
 
@ BottomToTop
Draw points with larger Z values last.
 
@ Default
Draw points in the order they are stored.
 
@ TopToBottom
Draw points with larger Z values first.
 
@ RenderOverviewAndExtents
Render point cloud extents over overview point cloud.
 
@ RenderExtents
Render only point cloud extents when zoomed out.
 
@ RenderOverview
Render overview point cloud when zoomed out.
 
@ VectorTile
Vector tile layer. Added in QGIS 3.14.
 
@ RenderPartialOutputOverPreviousCachedImage
When rendering temporary in-progress preview renders, these preview renders can be drawn over any pre...
 
@ RenderPartialOutputs
The renderer benefits from rendering temporary in-progress preview renders. These are temporary resul...
 
@ Local
Local means the source is a local file on the machine.
 
@ Remote
Remote means it's loaded through a protocol like HTTP.
 
@ Reverse
Reverse/inverse transform (from destination to source)
 
static QgsRuntimeProfiler * profiler()
Returns the application runtime profiler.
 
A 3-dimensional box composed of x, y, z coordinates.
 
double zMaximum() const
Returns the maximum z value.
 
QgsRectangle toRectangle() const
Converts the box to a 2D rectangle.
 
double zMinimum() const
Returns the minimum z value.
 
Custom exception class for Coordinate Reference System related exceptions.
 
QgsRange which stores a range of double values.
 
bool isInfinite() const
Returns true if the range consists of all possible values.
 
Stores a digital elevation model in a raster image which may get updated as a part of the map layer r...
 
static QRgb encodeElevation(float z)
Converts elevation value to an actual color.
 
QRgb * rawElevationImageData()
Returns pointer to the actual elevation image data.
 
Base class for feedback objects to be used for cancellation of something running in a worker thread.
 
bool isCanceled() const
Tells whether the operation has been canceled already.
 
void canceled()
Internal routines can connect to this signal if they use event loop.
 
static QPainterPath calculatePainterClipRegion(const QList< QgsMapClippingRegion > ®ions, const QgsRenderContext &context, Qgis::LayerType layerType, bool &shouldClip)
Returns a QPainterPath representing the intersection of clipping regions from context which should be...
 
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.
 
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...
 
static constexpr int MAX_TIME_TO_USE_CACHED_PREVIEW_IMAGE
Maximum time (in ms) to allow display of a previously cached preview image while rendering layers,...
 
QString layerId() const
Gets access to the ID of the layer rendered by this class.
 
QgsRenderContext * renderContext()
Returns the render context associated with the renderer.
 
QRectF transformBounds(const QRectF &bounds) const
Transforms a bounding box from map coordinates to device coordinates.
 
static void logMessage(const QString &message, const QString &tag=QString(), Qgis::MessageLevel level=Qgis::MessageLevel::Warning, bool notifyUser=true, const char *file=__builtin_FILE(), const char *function=__builtin_FUNCTION(), int line=__builtin_LINE())
Adds a message to the log instance (and creates it if necessary).
 
A collection of point cloud attributes.
 
void push_back(const QgsPointCloudAttribute &attribute)
Adds extra attribute.
 
const QgsPointCloudAttribute & at(int index) const
Returns the attribute at the specified index.
 
QVector< QgsPointCloudAttribute > attributes() const
Returns all attributes.
 
int indexOf(const QString &name) const
Returns the index of the attribute with the specified name.
 
Attribute for point cloud data pair of name and size in bytes.
 
Base class for handling loading QgsPointCloudBlock asynchronously.
 
QString errorStr()
Returns the error message string of the request.
 
void finished()
Emitted when the request processing has finished.
 
std::unique_ptr< QgsPointCloudBlock > takeBlock()
Returns the requested block.
 
Base class for storing raw data from point cloud nodes.
 
virtual QgsGeometry polygonBounds() const
Returns the polygon bounds of the layer.
 
A renderer for 2d visualisation of point clouds which shows the dataset's extents using a fill symbol...
 
Smart pointer for QgsAbstractPointCloudIndex.
 
int span() const
Returns the number of points in one direction in a single node.
 
QgsVector3D offset() const
Returns offset of data from CRS.
 
QgsVector3D scale() const
Returns scale of data relative to CRS.
 
QgsPointCloudBlockRequest * asyncNodeData(const QgsPointCloudNodeId &n, const QgsPointCloudRequest &request)
Returns a handle responsible for loading a node data block.
 
bool isValid() const
Returns whether index is loaded and valid.
 
QgsRectangle extent() const
Returns extent of the data.
 
std::unique_ptr< QgsPointCloudBlock > nodeData(const QgsPointCloudNodeId &n, const QgsPointCloudRequest &request)
Returns node data block.
 
QgsPointCloudNodeId root() const
Returns root node of the index.
 
QgsPointCloudNode getNode(const QgsPointCloudNodeId &id) const
Returns object for a given node.
 
Qgis::PointCloudAccessType accessType() const
Returns the access type of the data If the access type is Remote, data will be fetched from an HTTP s...
 
Point cloud layer specific subclass of QgsMapLayerElevationProperties.
 
~QgsPointCloudLayerRenderer()
 
bool forceRasterRender() const override
Returns true if the renderer must be rendered to a raster paint device (e.g.
 
QgsPointCloudLayerRenderer(QgsPointCloudLayer *layer, QgsRenderContext &context)
Ctor.
 
void setLayerRenderingTimeHint(int time) override
Sets approximate render time (in ms) for the layer to render.
 
bool render() override
Do the rendering (based on data stored in the class).
 
Qgis::MapLayerRendererFlags flags() const override
Returns flags which control how the map layer rendering behaves.
 
Represents a map layer supporting display of point clouds.
 
QgsMapLayerElevationProperties * elevationProperties() override
Returns the layer's elevation properties.
 
QgsPointCloudRenderer * renderer()
Returns the 2D renderer for the point cloud.
 
QgsPointCloudIndex index() const
Returns the point cloud index associated with the layer.
 
QgsPointCloudDataProvider * dataProvider() override
Returns the layer's data provider, it may be nullptr.
 
Represents an indexed point cloud node's position in octree.
 
QString toString() const
Encode node to string.
 
Keeps metadata for an indexed point cloud node.
 
qint64 pointCount() const
Returns number of points contained in node data.
 
QgsBox3D bounds() const
Returns node's bounding cube in CRS coords.
 
Encapsulates the render context for a 2D point cloud rendering operation.
 
int yOffset() const
Returns the offset for the y value in a point record.
 
QgsVector3D offset() const
Returns the offset of the layer's int32 coordinates compared to CRS coords.
 
QgsRenderContext & renderContext()
Returns a reference to the context's render context.
 
void setOffset(const QgsVector3D &offset)
Sets the offset of the layer's int32 coordinates compared to CRS coords.
 
void setScale(const QgsVector3D &scale)
Sets the scale of the layer's int32 coordinates compared to CRS coords.
 
int pointRecordSize() const
Returns the size of a single point record.
 
int xOffset() const
Returns the offset for the x value in a point record.
 
QgsVector3D scale() const
Returns the scale of the layer's int32 coordinates compared to CRS coords.
 
TriangulationData & triangulationData()
Returns reference to the triangulation data structure (only used when rendering as triangles is enabl...
 
int zOffset() const
Returns the offset for the y value in a point record.
 
QgsFeedback * feedback() const
Returns the feedback object used to cancel rendering.
 
void setAttributes(const QgsPointCloudAttributeCollection &attributes)
Sets the attributes associated with the rendered block.
 
virtual QgsPointCloudRenderer * clone() const =0
Create a deep copy of this renderer.
 
Point cloud data request.
 
void setAttributes(const QgsPointCloudAttributeCollection &attributes)
Set attributes filter in the request.
 
bool overlaps(const QgsRange< T > &other) const
Returns true if this range overlaps another range.
 
A rectangle specified with double values.
 
bool intersects(const QgsRectangle &rect) const
Returns true when rectangle intersects with other rectangle.
 
Contains information about the context of a rendering operation.
 
double convertToPainterUnits(double size, Qgis::RenderUnit unit, const QgsMapUnitScale &scale=QgsMapUnitScale(), Qgis::RenderSubcomponentProperty property=Qgis::RenderSubcomponentProperty::Generic) const
Converts a size from the specified units to painter units (pixels).
 
QPainter * painter()
Returns the destination QPainter for the render operation.
 
void setPainterFlagsUsingContext(QPainter *painter=nullptr) const
Sets relevant flags on a destination painter, using the flags and settings currently defined for the ...
 
QgsElevationMap * elevationMap() const
Returns the destination elevation map for the render operation.
 
const QgsRectangle & extent() const
When rendering a map layer, calling this method returns the "clipping" extent for the layer (in the l...
 
float devicePixelRatio() const
Returns the device pixel ratio.
 
const QgsMapToPixel & mapToPixel() const
Returns the context's map to pixel transform, which transforms between map coordinates and device coo...
 
void setPainter(QPainter *p)
Sets the destination QPainter for the render operation.
 
QgsDoubleRange zRange() const
Returns the range of z-values which should be rendered.
 
QSize deviceOutputSize() const
Returns the device output size of the render.
 
bool renderingStopped() const
Returns true if the rendering operation has been stopped and any ongoing rendering should be canceled...
 
QPainter * previewRenderPainter()
Returns the const destination QPainter for temporary in-progress preview renders.
 
QgsCoordinateTransform coordinateTransform() const
Returns the current coordinate transform for the context.
 
void record(const QString &name, double time, const QString &group="startup", const QString &id=QString())
Manually adds a profile event with the given name and total time (in seconds).
 
Scoped object for saving and restoring a QPainter object's state.
 
A 3D vector (similar to QVector3D) with the difference that it uses double precision instead of singl...
 
double y() const
Returns Y coordinate.
 
double z() const
Returns Z coordinate.
 
double x() const
Returns X coordinate.
 
#define QgsDebugMsgLevel(str, level)
 
#define QgsDebugError(str)
 
bool isEdgeTooLong(const QPointF &p1, const QPointF &p2, float length)
 
Helper data structure used when rendering points as triangulated surface.
 
std::vector< QRgb > colors
RGB color for each point.
 
std::vector< float > elevations
Z value for each point (only used when global map shading is enabled)
 
std::vector< double > points
X,Y for each point - kept in this structure so that we can use it without further conversions in Dela...