Skip to content

Commit

Permalink
Cleanup identification handling of 3d point cloud symbol subclasses,
Browse files Browse the repository at this point in the history
and fix loss of symbol type when saving/restoring projects
  • Loading branch information
nyalldawson committed Dec 4, 2020
1 parent 89ed1b1 commit 2f14a53
Show file tree
Hide file tree
Showing 6 changed files with 126 additions and 163 deletions.
27 changes: 12 additions & 15 deletions python/3d/auto_generated/symbols/qgspointcloud3dsymbol.sip.in
Expand Up @@ -40,23 +40,19 @@ class QgsPointCloud3DSymbol : QgsAbstract3DSymbol /Abstract/
RgbRendering
};

static QString renderingStyletoString( RenderingStyle renderingStyle );
%Docstring
Converts from ``renderingStyle`` enum to a string
%End
static RenderingStyle renderingStylefromString( const QString &str );
%Docstring
Converts from a string to rendering style
%End

QgsPointCloud3DSymbol( QgsPointCloud3DSymbol::RenderingStyle style );
QgsPointCloud3DSymbol();
%Docstring
Constructor for QgsPointCloud3DSymbol
%End
~QgsPointCloud3DSymbol();

virtual QString type() const;

virtual QString symbolType() const = 0;
%Docstring
Returns a unique string identifier of the symbol type.
%End

float pointSize() const;
%Docstring
Returns the point size of the point cloud
Expand All @@ -69,11 +65,6 @@ Returns the point size of the point cloud
Sets the point size

.. seealso:: :py:func:`pointSize`
%End

QgsPointCloud3DSymbol::RenderingStyle renderingStyle() const;
%Docstring
Returns the rendering style used to render the point cloud
%End

virtual unsigned int byteStride() = 0;
Expand Down Expand Up @@ -106,6 +97,8 @@ class QgsSingleColorPointCloud3DSymbol : QgsPointCloud3DSymbol
Constructor for QgsSingleColorPointCloud3DSymbol
%End

virtual QString symbolType() const;

virtual QgsAbstract3DSymbol *clone() const /Factory/;


Expand Down Expand Up @@ -157,6 +150,8 @@ Constructor for QgsColorRampPointCloud3DSymbol

virtual QgsAbstract3DSymbol *clone() const /Factory/;

virtual QString symbolType() const;


virtual void writeXml( QDomElement &elem, const QgsReadWriteContext &context ) const;

Expand Down Expand Up @@ -238,6 +233,8 @@ class QgsRgbPointCloud3DSymbol : QgsPointCloud3DSymbol
Constructor for :py:class:`QgsRGBPointCloud3DSymbol`
%End

virtual QString symbolType() const;

virtual QgsAbstract3DSymbol *clone() const /Factory/;


Expand Down
29 changes: 12 additions & 17 deletions src/3d/qgspointcloudlayer3drenderer.cpp
Expand Up @@ -118,7 +118,7 @@ void QgsPointCloudLayer3DRenderer::writeXml( QDomElement &elem, const QgsReadWri
QDomElement elemSymbol = doc.createElement( QStringLiteral( "symbol" ) );
if ( mSymbol )
{
elemSymbol.setAttribute( QStringLiteral( "type" ), mSymbol->type() );
elemSymbol.setAttribute( QStringLiteral( "type" ), mSymbol->symbolType() );
mSymbol->writeXml( elemSymbol, context );
}
elem.appendChild( elemSymbol );
Expand All @@ -129,22 +129,17 @@ void QgsPointCloudLayer3DRenderer::readXml( const QDomElement &elem, const QgsRe
mLayerRef = QgsMapLayerRef( elem.attribute( QStringLiteral( "layer" ) ) );

QDomElement elemSymbol = elem.firstChildElement( QStringLiteral( "symbol" ) );
QgsPointCloud3DSymbol::RenderingStyle renderingStyle = QgsPointCloud3DSymbol::renderingStylefromString( elemSymbol.attribute( QStringLiteral( "rendering-style" ) ) );
switch ( renderingStyle )
{
case QgsPointCloud3DSymbol::RenderingStyle::NoRendering:
mSymbol.reset( nullptr );
break;
case QgsPointCloud3DSymbol::RenderingStyle::SingleColor:
mSymbol.reset( new QgsSingleColorPointCloud3DSymbol );
break;
case QgsPointCloud3DSymbol::RenderingStyle::ColorRamp:
mSymbol.reset( new QgsColorRampPointCloud3DSymbol );
break;
case QgsPointCloud3DSymbol::RenderingStyle::RgbRendering:
mSymbol.reset( new QgsRgbPointCloud3DSymbol );
break;
}

const QString symbolType = elemSymbol.attribute( QStringLiteral( "type" ) );
if ( symbolType == QLatin1String( "single-color" ) )
mSymbol.reset( new QgsSingleColorPointCloud3DSymbol );
else if ( symbolType == QLatin1String( "color-ramp" ) )
mSymbol.reset( new QgsColorRampPointCloud3DSymbol );
else if ( symbolType == QLatin1String( "rgb" ) )
mSymbol.reset( new QgsRgbPointCloud3DSymbol );
else
mSymbol.reset();

if ( mSymbol )
mSymbol->readXml( elemSymbol, context );
}
Expand Down
21 changes: 7 additions & 14 deletions src/3d/qgspointcloudlayerchunkloader_p.cpp
Expand Up @@ -60,20 +60,13 @@ QgsPointCloudLayerChunkLoader::QgsPointCloudLayerChunkLoader( const QgsPointClou
Q_ASSERT( pc->hasNode( pcNode ) );

QgsDebugMsgLevel( QStringLiteral( "loading entity %1" ).arg( node->tileId().text() ), 2 );
switch ( symbol->renderingStyle() )
{
case QgsPointCloud3DSymbol::RenderingStyle::NoRendering:
break;
case QgsPointCloud3DSymbol::RenderingStyle::SingleColor:
mHandler.reset( new QgsSingleColorPointCloud3DSymbolHandler() );
break;
case QgsPointCloud3DSymbol::RenderingStyle::ColorRamp:
mHandler.reset( new QgsColorRampPointCloud3DSymbolHandler() );
break;
case QgsPointCloud3DSymbol::RenderingStyle::RgbRendering:
mHandler.reset( new QgsRGBPointCloud3DSymbolHandler() );
break;
}

if ( symbol->symbolType() == QLatin1String( "single-color" ) )
mHandler.reset( new QgsSingleColorPointCloud3DSymbolHandler() );
else if ( symbol->symbolType() == QLatin1String( "color-ramp" ) )
mHandler.reset( new QgsColorRampPointCloud3DSymbolHandler() );
else if ( symbol->symbolType() == QLatin1String( "rgb" ) )
mHandler.reset( new QgsRGBPointCloud3DSymbolHandler() );

//
// this will be run in a background thread
Expand Down
60 changes: 23 additions & 37 deletions src/3d/symbols/qgspointcloud3dsymbol.cpp
Expand Up @@ -24,32 +24,9 @@

// QgsPointCloud3DSymbol

QString QgsPointCloud3DSymbol::renderingStyletoString( QgsPointCloud3DSymbol::RenderingStyle renderingStyle )
{
switch ( renderingStyle )
{
case QgsPointCloud3DSymbol::RenderingStyle::NoRendering: return QString();
case QgsPointCloud3DSymbol::RenderingStyle::SingleColor: return QStringLiteral( "single-color" );
case QgsPointCloud3DSymbol::RenderingStyle::ColorRamp: return QStringLiteral( "color-ramp" );
case QgsPointCloud3DSymbol::RenderingStyle::RgbRendering: return QStringLiteral( "rgb" );
}
return QString();
}

QgsPointCloud3DSymbol::RenderingStyle QgsPointCloud3DSymbol::renderingStylefromString( const QString &str )
{
if ( str == QStringLiteral( "single-color" ) )
return QgsPointCloud3DSymbol::RenderingStyle::SingleColor;
if ( str == QStringLiteral( "color-ramp" ) )
return QgsPointCloud3DSymbol::RenderingStyle::ColorRamp;
if ( str == QStringLiteral( "rgb" ) )
return QgsPointCloud3DSymbol::RenderingStyle::RgbRendering;
return QgsPointCloud3DSymbol::RenderingStyle::NoRendering;
}

QgsPointCloud3DSymbol::QgsPointCloud3DSymbol( QgsPointCloud3DSymbol::RenderingStyle style )
QgsPointCloud3DSymbol::QgsPointCloud3DSymbol()
: QgsAbstract3DSymbol()
, mRenderingStyle( style )
{
}

Expand All @@ -63,11 +40,16 @@ void QgsPointCloud3DSymbol::setPointSize( float size )
// QgsSingleColorPointCloud3DSymbol

QgsSingleColorPointCloud3DSymbol::QgsSingleColorPointCloud3DSymbol()
: QgsPointCloud3DSymbol( QgsPointCloud3DSymbol::RenderingStyle::SingleColor )
: QgsPointCloud3DSymbol()
{

}

QString QgsSingleColorPointCloud3DSymbol::symbolType() const
{
return QStringLiteral( "single-color" );
}

QgsAbstract3DSymbol *QgsSingleColorPointCloud3DSymbol::clone() const
{
QgsSingleColorPointCloud3DSymbol *result = new QgsSingleColorPointCloud3DSymbol;
Expand All @@ -82,7 +64,6 @@ void QgsSingleColorPointCloud3DSymbol::writeXml( QDomElement &elem, const QgsRea
Q_UNUSED( context )

elem.setAttribute( QStringLiteral( "point-size" ), mPointSize );
elem.setAttribute( QStringLiteral( "rendering-style" ), renderingStyletoString( mRenderingStyle ) );
elem.setAttribute( QStringLiteral( "single-color" ), QgsSymbolLayerUtils::encodeColor( mSingleColor ) );
}

Expand All @@ -91,8 +72,7 @@ void QgsSingleColorPointCloud3DSymbol::readXml( const QDomElement &elem, const Q
Q_UNUSED( context )

mPointSize = elem.attribute( QStringLiteral( "point-size" ), QStringLiteral( "2.0" ) ).toFloat();
mRenderingStyle = renderingStylefromString( elem.attribute( QStringLiteral( "rendering-style" ), QString() ) ) ;
mSingleColor = QgsSymbolLayerUtils::decodeColor( elem.attribute( QStringLiteral( "single-color" ), QStringLiteral( "0,0,0" ) ) );
mSingleColor = QgsSymbolLayerUtils::decodeColor( elem.attribute( QStringLiteral( "single-color" ), QStringLiteral( "0,0,255" ) ) );
}

void QgsSingleColorPointCloud3DSymbol::setSingleColor( QColor color )
Expand All @@ -102,7 +82,7 @@ void QgsSingleColorPointCloud3DSymbol::setSingleColor( QColor color )

void QgsSingleColorPointCloud3DSymbol::fillMaterial( Qt3DRender::QMaterial *mat )
{
Qt3DRender::QParameter *renderingStyle = new Qt3DRender::QParameter( "u_renderingStyle", mRenderingStyle );
Qt3DRender::QParameter *renderingStyle = new Qt3DRender::QParameter( "u_renderingStyle", QgsPointCloud3DSymbol::SingleColor );
mat->addParameter( renderingStyle );
Qt3DRender::QParameter *pointSizeParameter = new Qt3DRender::QParameter( "u_pointSize", QVariant::fromValue( mPointSize ) );
mat->addParameter( pointSizeParameter );
Expand All @@ -113,7 +93,7 @@ void QgsSingleColorPointCloud3DSymbol::fillMaterial( Qt3DRender::QMaterial *mat
// QgsColorRampPointCloud3DSymbol

QgsColorRampPointCloud3DSymbol::QgsColorRampPointCloud3DSymbol()
: QgsPointCloud3DSymbol( QgsPointCloud3DSymbol::RenderingStyle::ColorRamp )
: QgsPointCloud3DSymbol()
{

}
Expand All @@ -130,12 +110,16 @@ QgsAbstract3DSymbol *QgsColorRampPointCloud3DSymbol::clone() const
return result;
}

QString QgsColorRampPointCloud3DSymbol::symbolType() const
{
return QStringLiteral( "color-ramp" );
}

void QgsColorRampPointCloud3DSymbol::writeXml( QDomElement &elem, const QgsReadWriteContext &context ) const
{
Q_UNUSED( context )

elem.setAttribute( QStringLiteral( "point-size" ), mPointSize );
elem.setAttribute( QStringLiteral( "rendering-style" ), mRenderingStyle );
elem.setAttribute( QStringLiteral( "rendering-parameter" ), mRenderingParameter );
elem.setAttribute( QStringLiteral( "color-ramp-shader-min" ), mColorRampShaderMin );
elem.setAttribute( QStringLiteral( "color-ramp-shader-max" ), mColorRampShaderMax );
Expand All @@ -149,7 +133,6 @@ void QgsColorRampPointCloud3DSymbol::readXml( const QDomElement &elem, const Qgs
Q_UNUSED( context )

mPointSize = elem.attribute( "point-size", QStringLiteral( "2.0" ) ).toFloat();
mRenderingStyle = static_cast< QgsPointCloud3DSymbol::RenderingStyle >( elem.attribute( "rendering-style", QStringLiteral( "2" ) ).toInt() );
mRenderingParameter = elem.attribute( "rendering-parameter", QString() );
mColorRampShaderMin = elem.attribute( QStringLiteral( "color-ramp-shader-min" ), QStringLiteral( "0.0" ) ).toDouble();
mColorRampShaderMax = elem.attribute( QStringLiteral( "color-ramp-shader-max" ), QStringLiteral( "1.0" ) ).toDouble();
Expand Down Expand Up @@ -184,7 +167,7 @@ void QgsColorRampPointCloud3DSymbol::setColorRampShaderMinMax( double min, doubl

void QgsColorRampPointCloud3DSymbol::fillMaterial( Qt3DRender::QMaterial *mat )
{
Qt3DRender::QParameter *renderingStyle = new Qt3DRender::QParameter( "u_renderingStyle", mRenderingStyle );
Qt3DRender::QParameter *renderingStyle = new Qt3DRender::QParameter( "u_renderingStyle", QgsPointCloud3DSymbol::ColorRamp );
mat->addParameter( renderingStyle );
Qt3DRender::QParameter *pointSizeParameter = new Qt3DRender::QParameter( "u_pointSize", QVariant::fromValue( mPointSize ) );
mat->addParameter( pointSizeParameter );
Expand All @@ -211,11 +194,16 @@ void QgsColorRampPointCloud3DSymbol::fillMaterial( Qt3DRender::QMaterial *mat )
// QgsRgbPointCloud3DSymbol

QgsRgbPointCloud3DSymbol::QgsRgbPointCloud3DSymbol()
: QgsPointCloud3DSymbol( QgsPointCloud3DSymbol::RenderingStyle::RgbRendering )
: QgsPointCloud3DSymbol()
{

}

QString QgsRgbPointCloud3DSymbol::symbolType() const
{
return QStringLiteral( "rgb" );
}

QgsAbstract3DSymbol *QgsRgbPointCloud3DSymbol::clone() const
{
QgsRgbPointCloud3DSymbol *result = new QgsRgbPointCloud3DSymbol;
Expand All @@ -227,20 +215,18 @@ QgsAbstract3DSymbol *QgsRgbPointCloud3DSymbol::clone() const
void QgsRgbPointCloud3DSymbol::writeXml( QDomElement &elem, const QgsReadWriteContext &context ) const
{
Q_UNUSED( context )
elem.setAttribute( QStringLiteral( "rendering-style" ), mRenderingStyle );
elem.setAttribute( QStringLiteral( "point-size" ), mPointSize );
}

void QgsRgbPointCloud3DSymbol::readXml( const QDomElement &elem, const QgsReadWriteContext &context )
{
Q_UNUSED( context )
mRenderingStyle = static_cast< QgsPointCloud3DSymbol::RenderingStyle >( elem.attribute( "rendering-style", QStringLiteral( "3" ) ).toInt() );
mPointSize = elem.attribute( "point-size", QStringLiteral( "2.0" ) ).toFloat();
}

void QgsRgbPointCloud3DSymbol::fillMaterial( Qt3DRender::QMaterial *mat )
{
Qt3DRender::QParameter *renderingStyle = new Qt3DRender::QParameter( "u_renderingStyle", mRenderingStyle );
Qt3DRender::QParameter *renderingStyle = new Qt3DRender::QParameter( "u_renderingStyle", QgsPointCloud3DSymbol::RgbRendering );
mat->addParameter( renderingStyle );
Qt3DRender::QParameter *pointSizeParameter = new Qt3DRender::QParameter( "u_pointSize", QVariant::fromValue( mPointSize ) );
mat->addParameter( pointSizeParameter );
Expand Down
21 changes: 10 additions & 11 deletions src/3d/symbols/qgspointcloud3dsymbol.h
Expand Up @@ -52,18 +52,18 @@ class _3D_EXPORT QgsPointCloud3DSymbol : public QgsAbstract3DSymbol SIP_ABSTRACT
RgbRendering
};

//! Converts from \a renderingStyle enum to a string
static QString renderingStyletoString( RenderingStyle renderingStyle );
//! Converts from a string to rendering style
static RenderingStyle renderingStylefromString( const QString &str );

//! Constructor for QgsPointCloud3DSymbol
QgsPointCloud3DSymbol( QgsPointCloud3DSymbol::RenderingStyle style );
QgsPointCloud3DSymbol();
//! Destructor for QgsPointCloud3DSymbol
~QgsPointCloud3DSymbol() override;

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

/**
* Returns a unique string identifier of the symbol type.
*/
virtual QString symbolType() const = 0;

/**
* Returns the point size of the point cloud
* \see setPointSize( float size )
Expand All @@ -76,16 +76,12 @@ class _3D_EXPORT QgsPointCloud3DSymbol : public QgsAbstract3DSymbol SIP_ABSTRACT
*/
void setPointSize( float size );

//! Returns the rendering style used to render the point cloud
QgsPointCloud3DSymbol::RenderingStyle renderingStyle() const { return mRenderingStyle; }

//! Returns the byte stride for the geometries used to for the vertex buffer
virtual unsigned int byteStride() = 0;
//! Used to fill material object with necessary QParameters (and consequently opengl uniforms)
virtual void fillMaterial( Qt3DRender::QMaterial *material ) = 0 SIP_SKIP;

protected:
QgsPointCloud3DSymbol::RenderingStyle mRenderingStyle = QgsPointCloud3DSymbol::NoRendering;
float mPointSize = 2.0;
};

Expand All @@ -104,6 +100,7 @@ class _3D_EXPORT QgsSingleColorPointCloud3DSymbol : public QgsPointCloud3DSymbol
//! Constructor for QgsSingleColorPointCloud3DSymbol
QgsSingleColorPointCloud3DSymbol();

QString symbolType() const override;
QgsAbstract3DSymbol *clone() const override SIP_FACTORY;

void writeXml( QDomElement &elem, const QgsReadWriteContext &context ) const override;
Expand All @@ -126,7 +123,7 @@ class _3D_EXPORT QgsSingleColorPointCloud3DSymbol : public QgsPointCloud3DSymbol


private:
QColor mSingleColor = Qt::blue;
QColor mSingleColor = QColor( 0, 0, 255 );
};

/**
Expand All @@ -145,6 +142,7 @@ class _3D_EXPORT QgsColorRampPointCloud3DSymbol : public QgsPointCloud3DSymbol
QgsColorRampPointCloud3DSymbol();

QgsAbstract3DSymbol *clone() const override SIP_FACTORY;
QString symbolType() const override;

void writeXml( QDomElement &elem, const QgsReadWriteContext &context ) const override;
void readXml( const QDomElement &elem, const QgsReadWriteContext &context ) override;
Expand Down Expand Up @@ -216,6 +214,7 @@ class _3D_EXPORT QgsRgbPointCloud3DSymbol : public QgsPointCloud3DSymbol
//! Constructor for QgsRGBPointCloud3DSymbol
QgsRgbPointCloud3DSymbol();

QString symbolType() const override;
QgsAbstract3DSymbol *clone() const override SIP_FACTORY;

void writeXml( QDomElement &elem, const QgsReadWriteContext &context ) const override;
Expand Down

0 comments on commit 2f14a53

Please sign in to comment.