Skip to content

Commit

Permalink
Use rendering context instead of passing the symbol to the handler
Browse files Browse the repository at this point in the history
  • Loading branch information
NEDJIMAbelgacem authored and wonder-sk committed Dec 3, 2020
1 parent 4659864 commit 70f96b0
Show file tree
Hide file tree
Showing 10 changed files with 183 additions and 135 deletions.
18 changes: 3 additions & 15 deletions python/3d/auto_generated/symbols/qgspointcloud3dsymbol.sip.in
Expand Up @@ -44,18 +44,6 @@ class QgsPointCloud3DSymbol : QgsAbstract3DSymbol

virtual QString type() const;

QgsPointCloudLayer *layer();
%Docstring
Returns the point cloud layer object used by the symbol
see setLayer( :py:class:`QgsPointCloudLayer` *layer )
%End

void setLayer( QgsPointCloudLayer *layer );
%Docstring
Sets the point cloud layer object used by the symbol
see :py:func:`~QgsPointCloud3DSymbol.layer`
%End

float pointSize() const;
%Docstring
Returns the point size of the point cloud
Expand Down Expand Up @@ -100,7 +88,7 @@ class QgsSingleColorPointCloud3DSymbol : QgsPointCloud3DSymbol
#include "qgspointcloud3dsymbol.h"
%End
public:
QgsSingleColorPointCloud3DSymbol( QgsPointCloudLayer *layer );
QgsSingleColorPointCloud3DSymbol();
%Docstring
Constructor for QgsSingleColorPointCloud3DSymbol
%End
Expand Down Expand Up @@ -149,7 +137,7 @@ class QgsColorRampPointCloud3DSymbol : QgsPointCloud3DSymbol
#include "qgspointcloud3dsymbol.h"
%End
public:
QgsColorRampPointCloud3DSymbol( QgsPointCloudLayer *layer );
QgsColorRampPointCloud3DSymbol();
%Docstring
Constructor for QgsColorRampPointCloud3DSymbol
%End
Expand Down Expand Up @@ -232,7 +220,7 @@ class QgsRGBPointCloud3DSymbol : QgsPointCloud3DSymbol
#include "qgspointcloud3dsymbol.h"
%End
public:
QgsRGBPointCloud3DSymbol( QgsPointCloudLayer *layer );
QgsRGBPointCloud3DSymbol();
%Docstring
Constructor for QgsRGBPointCloud3DSymbol
%End
Expand Down
27 changes: 20 additions & 7 deletions src/3d/qgspointcloudlayer3drenderer.cpp
Expand Up @@ -28,6 +28,23 @@

#include "qgis.h"

QgsPointCloud3DRenderContext::QgsPointCloud3DRenderContext( const Qgs3DMapSettings &map, QgsPointCloud3DSymbol *symbol )
: Qgs3DRenderContext( map )
, mSymbol( symbol )
{

}

void QgsPointCloud3DRenderContext::setAttributes( const QgsPointCloudAttributeCollection &attributes )
{
mAttributes = attributes;
}

void QgsPointCloud3DRenderContext::setSymbol( QgsPointCloud3DSymbol *symbol )
{
mSymbol.reset( symbol );
}

QgsPointCloudLayer3DRendererMetadata::QgsPointCloudLayer3DRendererMetadata()
: Qgs3DRendererAbstractMetadata( QStringLiteral( "pointcloud" ) )
{
Expand All @@ -51,8 +68,6 @@ QgsPointCloudLayer3DRenderer::QgsPointCloudLayer3DRenderer( )
void QgsPointCloudLayer3DRenderer::setLayer( QgsPointCloudLayer *layer )
{
mLayerRef = QgsMapLayerRef( layer );
if ( mSymbol )
mSymbol->setLayer( layer );
}

QgsPointCloudLayer *QgsPointCloudLayer3DRenderer::layer() const
Expand Down Expand Up @@ -122,13 +137,13 @@ void QgsPointCloudLayer3DRenderer::readXml( const QDomElement &elem, const QgsRe
mSymbol.reset( nullptr );
break;
case QgsPointCloud3DSymbol::RenderingStyle::SingleColor:
mSymbol.reset( new QgsSingleColorPointCloud3DSymbol( layer() ) );
mSymbol.reset( new QgsSingleColorPointCloud3DSymbol );
break;
case QgsPointCloud3DSymbol::RenderingStyle::ColorRamp:
mSymbol.reset( new QgsColorRampPointCloud3DSymbol( layer() ) );
mSymbol.reset( new QgsColorRampPointCloud3DSymbol );
break;
case QgsPointCloud3DSymbol::RenderingStyle::RGBRendering:
mSymbol.reset( new QgsRGBPointCloud3DSymbol( layer() ) );
mSymbol.reset( new QgsRGBPointCloud3DSymbol );
break;
}
if ( mSymbol )
Expand All @@ -138,6 +153,4 @@ void QgsPointCloudLayer3DRenderer::readXml( const QDomElement &elem, const QgsRe
void QgsPointCloudLayer3DRenderer::resolveReferences( const QgsProject &project )
{
mLayerRef.setLayer( project.mapLayer( mLayerRef.layerId ) );
if ( mSymbol )
mSymbol->setLayer( layer() );
}
64 changes: 64 additions & 0 deletions src/3d/qgspointcloudlayer3drenderer.h
Expand Up @@ -27,9 +27,73 @@

class QgsPointCloudLayer;
#include "qgspointcloud3dsymbol.h"
#include "qgsfeature3dhandler_p.h"

#ifndef SIP_RUN

/**
* \ingroup core
* \class QgsPointCloud3DRenderContext
*
* Encapsulates the render context for a 3D point cloud rendering operation.
*
* \since QGIS 3.18
*/
class CORE_EXPORT QgsPointCloud3DRenderContext : public Qgs3DRenderContext
{
public:

/**
* Constructor for QgsPointCloud3DRenderContext.
*
* The \a scale and \a offset arguments specify the scale and offset of the layer's int32 coordinates
* compared to CRS coordinates respectively.
*/
QgsPointCloud3DRenderContext( const Qgs3DMapSettings &map, QgsPointCloud3DSymbol *symbol );

//! QgsPointCloudRenderContext cannot be copied.
QgsPointCloud3DRenderContext( const QgsPointCloud3DRenderContext &rh ) = delete;

//! QgsPointCloudRenderContext cannot be copied.
QgsPointCloud3DRenderContext &operator=( const QgsPointCloud3DRenderContext & ) = delete;

/**
* Returns the attributes associated with the rendered block.
*
* \see setAttributes()
*/
QgsPointCloudAttributeCollection attributes() const { return mAttributes; }

/**
* Sets the \a attributes associated with the rendered block.
*
* \see attributes()
*/
void setAttributes( const QgsPointCloudAttributeCollection &attributes );

/**
* Returns the symbol used for rendering the point cloud
*
* \see setSymbol()
*/
QgsPointCloud3DSymbol *symbol() const { return mSymbol.get(); }

/**
* Sets the \a symbol used for rendering the point cloud
*
* \see symbol()
*/
void setSymbol( QgsPointCloud3DSymbol *symbol );

private:
#ifdef SIP_RUN
QgsPointCloudRenderContext( const QgsPointCloudRenderContext &rh );
#endif
QgsPointCloudAttributeCollection mAttributes;
std::unique_ptr<QgsPointCloud3DSymbol> mSymbol;
};


/**
* \ingroup core
* Metadata for point cloud layer 3D renderer to allow creation of its instances from XML
Expand Down
10 changes: 6 additions & 4 deletions src/3d/qgspointcloudlayerchunkloader_p.cpp
Expand Up @@ -49,9 +49,11 @@
QgsPointCloudLayerChunkLoader::QgsPointCloudLayerChunkLoader( const QgsPointCloudLayerChunkLoaderFactory *factory, QgsChunkNode *node, QgsPointCloud3DSymbol *symbol )
: QgsChunkLoader( node )
, mFactory( factory )
, mContext( factory->mMap )
, mContext( factory->mMap, dynamic_cast<QgsPointCloud3DSymbol *>( symbol->clone() ) )
{
QgsPointCloudIndex *pc = mFactory->mPointCloudIndex;
mContext.setAttributes( pc->attributes() );

QgsChunkNodeId nodeId = node->tileId();
IndexedPointCloudNode pcNode( nodeId.d, nodeId.x, nodeId.y, nodeId.z );

Expand All @@ -63,13 +65,13 @@ QgsPointCloudLayerChunkLoader::QgsPointCloudLayerChunkLoader( const QgsPointClou
case QgsPointCloud3DSymbol::NoRendering:
break;
case QgsPointCloud3DSymbol::SingleColor:
mHandler.reset( new QgsSingleColorPointCloud3DSymbolHandler( symbol ) );
mHandler.reset( new QgsSingleColorPointCloud3DSymbolHandler() );
break;
case QgsPointCloud3DSymbol::ColorRamp:
mHandler.reset( new QgsColorRampPointCloud3DSymbolHandler( symbol ) );
mHandler.reset( new QgsColorRampPointCloud3DSymbolHandler() );
break;
case QgsPointCloud3DSymbol::RGBRendering:
mHandler.reset( new QgsRGBPointCloud3DSymbolHandler( symbol ) );
mHandler.reset( new QgsRGBPointCloud3DSymbolHandler() );
break;
}

Expand Down
3 changes: 2 additions & 1 deletion src/3d/qgspointcloudlayerchunkloader_p.h
Expand Up @@ -32,6 +32,7 @@
#include "qgschunkedentity_p.h"
#include "qgspointcloud3dsymbol.h"
#include "qgspointcloud3dsymbol_p.h"
#include "qgspointcloudlayer3drenderer.h"

#include <memory>

Expand Down Expand Up @@ -94,7 +95,7 @@ class QgsPointCloudLayerChunkLoader : public QgsChunkLoader
private:
const QgsPointCloudLayerChunkLoaderFactory *mFactory;
std::unique_ptr<QgsPointCloud3DSymbolHandler> mHandler;
Qgs3DRenderContext mContext;
QgsPointCloud3DRenderContext mContext;
bool mCanceled = false;
QFutureWatcher<void> *mFutureWatcher = nullptr;
};
Expand Down
26 changes: 10 additions & 16 deletions src/3d/symbols/qgspointcloud3dsymbol.cpp
Expand Up @@ -23,36 +23,30 @@

// QgsPointCloud3DSymbol

QgsPointCloud3DSymbol::QgsPointCloud3DSymbol( QgsPointCloudLayer *layer, QgsPointCloud3DSymbol::RenderingStyle style )
QgsPointCloud3DSymbol::QgsPointCloud3DSymbol( QgsPointCloud3DSymbol::RenderingStyle style )
: QgsAbstract3DSymbol()
, mRenderingStyle( style )
, mLayer( layer )
{
}

QgsPointCloud3DSymbol::~QgsPointCloud3DSymbol() { }

void QgsPointCloud3DSymbol::setLayer( QgsPointCloudLayer *layer )
{
mLayer = layer;
}

void QgsPointCloud3DSymbol::setPointSize( float size )
{
mPointSize = size;
}

// QgsSingleColorPointCloud3DSymbol

QgsSingleColorPointCloud3DSymbol::QgsSingleColorPointCloud3DSymbol( QgsPointCloudLayer *layer )
: QgsPointCloud3DSymbol( layer, QgsPointCloud3DSymbol::RenderingStyle::SingleColor )
QgsSingleColorPointCloud3DSymbol::QgsSingleColorPointCloud3DSymbol()
: QgsPointCloud3DSymbol( QgsPointCloud3DSymbol::RenderingStyle::SingleColor )
{

}

QgsAbstract3DSymbol *QgsSingleColorPointCloud3DSymbol::clone() const
{
QgsSingleColorPointCloud3DSymbol *result = new QgsSingleColorPointCloud3DSymbol( mLayer );
QgsSingleColorPointCloud3DSymbol *result = new QgsSingleColorPointCloud3DSymbol;
result->mPointSize = mPointSize;
result->mSingleColor = mSingleColor;
copyBaseSettings( result );
Expand Down Expand Up @@ -98,15 +92,15 @@ void QgsSingleColorPointCloud3DSymbol::fillMaterial( Qt3DRender::QMaterial *mat

// QgsColorRampPointCloud3DSymbol

QgsColorRampPointCloud3DSymbol::QgsColorRampPointCloud3DSymbol( QgsPointCloudLayer *layer )
: QgsPointCloud3DSymbol( layer, QgsPointCloud3DSymbol::RenderingStyle::ColorRamp )
QgsColorRampPointCloud3DSymbol::QgsColorRampPointCloud3DSymbol()
: QgsPointCloud3DSymbol( QgsPointCloud3DSymbol::RenderingStyle::ColorRamp )
{

}

QgsAbstract3DSymbol *QgsColorRampPointCloud3DSymbol::clone() const
{
QgsColorRampPointCloud3DSymbol *result = new QgsColorRampPointCloud3DSymbol( mLayer );
QgsColorRampPointCloud3DSymbol *result = new QgsColorRampPointCloud3DSymbol;
result->mPointSize = mPointSize;
result->mRenderingParameter = mRenderingParameter;
result->mColorRampShader = mColorRampShader;
Expand Down Expand Up @@ -196,15 +190,15 @@ void QgsColorRampPointCloud3DSymbol::fillMaterial( Qt3DRender::QMaterial *mat )

// QgsRGBPointCloud3DSymbol

QgsRGBPointCloud3DSymbol::QgsRGBPointCloud3DSymbol( QgsPointCloudLayer *layer )
: QgsPointCloud3DSymbol( layer, QgsPointCloud3DSymbol::RenderingStyle::RGBRendering )
QgsRGBPointCloud3DSymbol::QgsRGBPointCloud3DSymbol()
: QgsPointCloud3DSymbol( QgsPointCloud3DSymbol::RenderingStyle::RGBRendering )
{

}

QgsAbstract3DSymbol *QgsRGBPointCloud3DSymbol::clone() const
{
QgsRGBPointCloud3DSymbol *result = new QgsRGBPointCloud3DSymbol( mLayer );
QgsRGBPointCloud3DSymbol *result = new QgsRGBPointCloud3DSymbol;
result->mPointSize = mPointSize;
copyBaseSettings( result );
return result;
Expand Down
21 changes: 4 additions & 17 deletions src/3d/symbols/qgspointcloud3dsymbol.h
Expand Up @@ -53,24 +53,12 @@ class _3D_EXPORT QgsPointCloud3DSymbol : public QgsAbstract3DSymbol
};

//! Constructor for QgsPointCloud3DSymbol
QgsPointCloud3DSymbol( QgsPointCloudLayer *layer, QgsPointCloud3DSymbol::RenderingStyle style ) SIP_SKIP;
QgsPointCloud3DSymbol( QgsPointCloud3DSymbol::RenderingStyle style ) SIP_SKIP;
//! Destructor for QgsPointCloud3DSymbol
~QgsPointCloud3DSymbol() override;

QString type() const override { return "pointcloud"; }

/**
* Returns the point cloud layer object used by the symbol
* see setLayer( QgsPointCloudLayer *layer )
*/
QgsPointCloudLayer *layer() { return mLayer; }

/**
* Sets the point cloud layer object used by the symbol
* see layer()
*/
void setLayer( QgsPointCloudLayer *layer );

/**
* Returns the point size of the point cloud
* \see setPointSize( float size )
Expand All @@ -93,7 +81,6 @@ class _3D_EXPORT QgsPointCloud3DSymbol : public QgsAbstract3DSymbol

protected:
QgsPointCloud3DSymbol::RenderingStyle mRenderingStyle = QgsPointCloud3DSymbol::NoRendering;
QgsPointCloudLayer *mLayer = nullptr;
float mPointSize = 2.0;
};

Expand All @@ -110,7 +97,7 @@ class _3D_EXPORT QgsSingleColorPointCloud3DSymbol : public QgsPointCloud3DSymbol
{
public:
//! Constructor for QgsSingleColorPointCloud3DSymbol
QgsSingleColorPointCloud3DSymbol( QgsPointCloudLayer *layer );
QgsSingleColorPointCloud3DSymbol();

QgsAbstract3DSymbol *clone() const override SIP_FACTORY;

Expand Down Expand Up @@ -150,7 +137,7 @@ class _3D_EXPORT QgsColorRampPointCloud3DSymbol : public QgsPointCloud3DSymbol
{
public:
//! Constructor for QgsColorRampPointCloud3DSymbol
QgsColorRampPointCloud3DSymbol( QgsPointCloudLayer *layer );
QgsColorRampPointCloud3DSymbol();

QgsAbstract3DSymbol *clone() const override SIP_FACTORY;

Expand Down Expand Up @@ -222,7 +209,7 @@ class _3D_EXPORT QgsRGBPointCloud3DSymbol : public QgsPointCloud3DSymbol
{
public:
//! Constructor for QgsRGBPointCloud3DSymbol
QgsRGBPointCloud3DSymbol( QgsPointCloudLayer *layer );
QgsRGBPointCloud3DSymbol();

QgsAbstract3DSymbol *clone() const override SIP_FACTORY;

Expand Down

0 comments on commit 70f96b0

Please sign in to comment.