Skip to content

Commit

Permalink
Add NoRendering symbol
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 3979b47 commit 095ac52
Show file tree
Hide file tree
Showing 12 changed files with 384 additions and 128 deletions.
44 changes: 30 additions & 14 deletions python/3d/auto_generated/symbols/qgspointcloud3dsymbol.sip.in
Expand Up @@ -29,9 +29,11 @@ class QgsPointCloud3DSymbol : QgsAbstract3DSymbol

enum RenderingStyle
{
//! Render the mesh with a single color
// Do not render anything
NoRendering,
//! Render the point cloud with a single color
SingleColor,
//! Render the mesh with a color ramp
//! Render the point cloud with a color ramp
ColorRamp,
};

Expand All @@ -48,28 +50,42 @@ Constructor for QgsPointCloud3DSymbol

virtual QString type() const;

bool isEnabled() const;
QgsPointCloud3DSymbol::RenderingStyle renderingStyle() const;
%Docstring
Returns whether rendering for this symbol is enabled
Returns the rendering style

.. seealso:: :py:func:`setIsEnabled`
.. seealso:: :py:func:`setRenderingStyle`
%End

void setIsEnabled( bool enabled );
protected:
};

class QgsNoRenderingPointCloud3DSymbol : QgsPointCloud3DSymbol
{
%Docstring
Sets whether rendering for this symbol is enabled
3D symbol that is used to indicate that the point cloud won't be rendered

.. seealso:: :py:func:`isEnabled`
%End
.. warning::

QgsPointCloud3DSymbol::RenderingStyle renderingStyle() const;
%Docstring
Returns the rendering style
This is not considered stable API, and may change in future QGIS releases. It is
exposed to the Python bindings as a tech preview only.

.. seealso:: :py:func:`setRenderingStyle`
.. versionadded:: 3.18
%End

protected:
%TypeHeaderCode
#include "qgspointcloud3dsymbol.h"
%End
public:
QgsNoRenderingPointCloud3DSymbol();

virtual QgsAbstract3DSymbol *clone() const /Factory/;


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

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

};

class QgsSingleColorPointCloud3DSymbol : QgsPointCloud3DSymbol
Expand Down
5 changes: 5 additions & 0 deletions src/3d/qgspointcloudlayer3drenderer.cpp
Expand Up @@ -79,6 +79,8 @@ Qt3DCore::QEntity *QgsPointCloudLayer3DRenderer::createEntity( const Qgs3DMapSet
QgsPointCloudLayer *pcl = layer();
if ( !pcl || !pcl->dataProvider() || !pcl->dataProvider()->index() )
return nullptr;
if ( mSymbol->renderingStyle() == QgsPointCloud3DSymbol::NoRendering )
return nullptr;

return new QgsPointCloudLayerChunkedEntity( pcl->dataProvider()->index(), map, dynamic_cast<QgsPointCloud3DSymbol *>( mSymbol->clone() ) );
}
Expand Down Expand Up @@ -114,6 +116,9 @@ void QgsPointCloudLayer3DRenderer::readXml( const QDomElement &elem, const QgsRe
QgsPointCloud3DSymbol::RenderingStyle renderingStyle = static_cast<QgsPointCloud3DSymbol::RenderingStyle>( renderingStyleInt );
switch ( renderingStyle )
{
case QgsPointCloud3DSymbol::RenderingStyle::NoRendering:
mSymbol.reset( new QgsSingleColorPointCloud3DSymbol );
break;
case QgsPointCloud3DSymbol::RenderingStyle::SingleColor:
mSymbol.reset( new QgsSingleColorPointCloud3DSymbol );
break;
Expand Down
17 changes: 15 additions & 2 deletions src/3d/qgspointcloudlayerchunkloader_p.cpp
Expand Up @@ -173,6 +173,9 @@ void QgsPointCloud3DSymbolHandler::makeEntity( Qt3DCore::QEntity *parent, const
Qt3DRender::QMaterial *mat = nullptr;
switch ( mSymbol->renderingStyle() )
{
case QgsPointCloud3DSymbol::RenderingStyle::NoRendering:
mat = constructMaterial( dynamic_cast<QgsNoRenderingPointCloud3DSymbol *>( mSymbol.get() ) );
break;
case QgsPointCloud3DSymbol::RenderingStyle::SingleColor:
mat = constructMaterial( dynamic_cast<QgsSingleColorPointCloud3DSymbol *>( mSymbol.get() ) );
break;
Expand All @@ -192,6 +195,9 @@ void QgsPointCloud3DSymbolHandler::makeEntity( Qt3DCore::QEntity *parent, const
pointSize->setSizeMode( Qt3DRender::QPointSize::Programmable ); // supported since OpenGL 3.2
switch ( mSymbol->renderingStyle() )
{
case QgsPointCloud3DSymbol::RenderingStyle::NoRendering:
// Do Nothing since there is no rendering
break;
case QgsPointCloud3DSymbol::RenderingStyle::SingleColor:
pointSize->setValue( dynamic_cast<QgsSingleColorPointCloud3DSymbol *>( mSymbol.get() )->pointSize() );
break;
Expand Down Expand Up @@ -228,6 +234,14 @@ void QgsPointCloud3DSymbolHandler::makeEntity( Qt3DCore::QEntity *parent, const
// cppcheck-suppress memleak
}

Qt3DRender::QMaterial *QgsPointCloud3DSymbolHandler::constructMaterial( QgsNoRenderingPointCloud3DSymbol *symbol )
{
Qt3DRender::QMaterial *mat = new Qt3DRender::QMaterial;
Qt3DRender::QParameter *renderingStyle = new Qt3DRender::QParameter( "u_renderingStyle", symbol->renderingStyle() );
mat->addParameter( renderingStyle );
return mat;
}

Qt3DRender::QMaterial *QgsPointCloud3DSymbolHandler::constructMaterial( QgsSingleColorPointCloud3DSymbol *symbol )
{
Qt3DRender::QMaterial *mat = new Qt3DRender::QMaterial;
Expand All @@ -236,6 +250,7 @@ Qt3DRender::QMaterial *QgsPointCloud3DSymbolHandler::constructMaterial( QgsSingl
Qt3DRender::QParameter *pointSizeParameter = new Qt3DRender::QParameter( "u_pointSize", QVariant::fromValue( symbol->pointSize() ) );
mat->addParameter( pointSizeParameter );
QColor singleColor = symbol->singleColor();
qDebug() << "color: " << singleColor.redF() << " " << singleColor.greenF() << " " << singleColor.blueF();
Qt3DRender::QParameter *singleColorParameter = new Qt3DRender::QParameter( "u_singleColor", QVector3D( singleColor.redF(), singleColor.greenF(), singleColor.blueF() ) );
mat->addParameter( singleColorParameter );
return mat;
Expand All @@ -248,8 +263,6 @@ Qt3DRender::QMaterial *QgsPointCloud3DSymbolHandler::constructMaterial( QgsColor
mat->addParameter( renderingStyle );
Qt3DRender::QParameter *pointSizeParameter = new Qt3DRender::QParameter( "u_pointSize", QVariant::fromValue( symbol->pointSize() ) );
mat->addParameter( pointSizeParameter );
Qt3DRender::QParameter *textureTypeParameter = new Qt3DRender::QParameter( "u_textureType", static_cast<int>( symbol->renderingStyle() ) );
mat->addParameter( textureTypeParameter );
Qt3DRender::QParameter *renderingParameter = new Qt3DRender::QParameter( "u_renderingParameter", symbol->renderingParameter() );
mat->addParameter( renderingParameter );
QgsColorRampShader colorRampShader = symbol->colorRampShader();
Expand Down
1 change: 1 addition & 0 deletions src/3d/qgspointcloudlayerchunkloader_p.h
Expand Up @@ -78,6 +78,7 @@ class QgsPointCloud3DSymbolHandler // : public QgsFeature3DHandler
//static Qt3DCore::QTransform *transform( QVector3D position, const QgsPoint3DSymbol *symbol );

private:
Qt3DRender::QMaterial *constructMaterial( QgsNoRenderingPointCloud3DSymbol *symbol );
Qt3DRender::QMaterial *constructMaterial( QgsSingleColorPointCloud3DSymbol *symbol );
Qt3DRender::QMaterial *constructMaterial( QgsColorRampPointCloud3DSymbol *symbol );

Expand Down
13 changes: 8 additions & 5 deletions src/3d/shaders/pointcloud.frag
Expand Up @@ -6,7 +6,7 @@ in float clsid;
out vec4 color;

// Sets the redering style, 0: unique color, 1: color ramp shader of terrain, 2: color ramp shader of 2D rendering
uniform int u_textureType;
uniform int u_renderingStyle;
// Sets the unique mesh color
uniform vec3 u_singleColor; //
// Sets the color ramp type, 0: linear, 1: discrete, 2: exact
Expand Down Expand Up @@ -137,13 +137,16 @@ vec4 colorRamp()

void main(void)
{
switch (u_textureType)
switch (u_renderingStyle)
{
case 0: // single color
case 0: // no rendering
color = vec4(0.0f, 0.0f, 0.0f, 0.0f);
break;
case 1: // single color
color = vec4(u_singleColor, 1.0f);
break;
case 1: // color ramp
color=colorRamp();
case 2: // color ramp
color = colorRamp();
break;
}
}
33 changes: 24 additions & 9 deletions src/3d/symbols/qgspointcloud3dsymbol.cpp
Expand Up @@ -21,14 +21,35 @@ QgsPointCloud3DSymbol::QgsPointCloud3DSymbol( QgsPointCloud3DSymbol::RenderingSt
: QgsAbstract3DSymbol()
, mRenderingStyle( style )
{

}

QgsPointCloud3DSymbol::~QgsPointCloud3DSymbol() { }

void QgsPointCloud3DSymbol::setIsEnabled( bool enabled )
// QgsNoRenderingPointCloud3DSymbol

QgsNoRenderingPointCloud3DSymbol::QgsNoRenderingPointCloud3DSymbol()
: QgsPointCloud3DSymbol( QgsPointCloud3DSymbol::RenderingStyle::NoRendering )
{
}

QgsAbstract3DSymbol *QgsNoRenderingPointCloud3DSymbol::clone() const
{
QgsNoRenderingPointCloud3DSymbol *result = new QgsNoRenderingPointCloud3DSymbol;
result->mRenderingStyle = mRenderingStyle;
copyBaseSettings( result );
return result;
}

void QgsNoRenderingPointCloud3DSymbol::writeXml( QDomElement &elem, const QgsReadWriteContext &context ) const
{
mEnabled = enabled;
Q_UNUSED( context )
elem.setAttribute( QStringLiteral( "rendering-style" ), mRenderingStyle );
}

void QgsNoRenderingPointCloud3DSymbol::readXml( const QDomElement &elem, const QgsReadWriteContext &context )
{
Q_UNUSED( context )
mRenderingStyle = static_cast< QgsPointCloud3DSymbol::RenderingStyle >( elem.attribute( "rendering-style", QStringLiteral( "0" ) ).toInt() );
}

// QgsSingleColorPointCloud3DSymbol
Expand All @@ -42,7 +63,6 @@ QgsSingleColorPointCloud3DSymbol::QgsSingleColorPointCloud3DSymbol()
QgsAbstract3DSymbol *QgsSingleColorPointCloud3DSymbol::clone() const
{
QgsSingleColorPointCloud3DSymbol *result = new QgsSingleColorPointCloud3DSymbol;
result->mEnabled = mEnabled;
result->mPointSize = mPointSize;
result->mRenderingStyle = mRenderingStyle;
result->mSingleColor = mSingleColor;
Expand All @@ -54,7 +74,6 @@ void QgsSingleColorPointCloud3DSymbol::writeXml( QDomElement &elem, const QgsRea
{
Q_UNUSED( context )

elem.setAttribute( QStringLiteral( "enabled" ), mEnabled );
elem.setAttribute( QStringLiteral( "point-size" ), mPointSize );
elem.setAttribute( QStringLiteral( "rendering-style" ), mRenderingStyle );
elem.setAttribute( QStringLiteral( "single-color-red" ), mSingleColor.redF() );
Expand All @@ -66,7 +85,6 @@ void QgsSingleColorPointCloud3DSymbol::readXml( const QDomElement &elem, const Q
{
Q_UNUSED( context )

mEnabled = elem.attribute( "enabled", QStringLiteral( "0" ) ).toInt();
mPointSize = elem.attribute( "point-size", QStringLiteral( "2.0" ) ).toFloat();
mRenderingStyle = static_cast< QgsPointCloud3DSymbol::RenderingStyle >( elem.attribute( "rendering-style", QStringLiteral( "0" ) ).toInt() );
mSingleColor.setRedF( elem.attribute( "single-color-red", QStringLiteral( "0.0" ) ).toFloat() );
Expand Down Expand Up @@ -95,7 +113,6 @@ QgsColorRampPointCloud3DSymbol::QgsColorRampPointCloud3DSymbol()
QgsAbstract3DSymbol *QgsColorRampPointCloud3DSymbol::clone() const
{
QgsColorRampPointCloud3DSymbol *result = new QgsColorRampPointCloud3DSymbol;
result->mEnabled = mEnabled;
result->mPointSize = mPointSize;
result->mRenderingStyle = mRenderingStyle;
result->mRenderingParameter = mRenderingParameter;
Expand All @@ -110,7 +127,6 @@ void QgsColorRampPointCloud3DSymbol::writeXml( QDomElement &elem, const QgsReadW
{
Q_UNUSED( context )

elem.setAttribute( QStringLiteral( "enabled" ), mEnabled );
elem.setAttribute( QStringLiteral( "point-size" ), mPointSize );
elem.setAttribute( QStringLiteral( "rendering-style" ), mRenderingStyle );
elem.setAttribute( QStringLiteral( "rendering-parameter" ), mRenderingParameter );
Expand All @@ -125,7 +141,6 @@ void QgsColorRampPointCloud3DSymbol::readXml( const QDomElement &elem, const Qgs
{
Q_UNUSED( context )

mEnabled = elem.attribute( "enabled", QStringLiteral( "0" ) ).toInt();
mPointSize = elem.attribute( "point-size", QStringLiteral( "2.0" ) ).toFloat();
mRenderingStyle = static_cast< QgsPointCloud3DSymbol::RenderingStyle >( elem.attribute( "rendering-style", QStringLiteral( "0" ) ).toInt() );
mRenderingParameter = static_cast< QgsColorRampPointCloud3DSymbol::RenderingParameter >( elem.attribute( "rendering-parameter", QStringLiteral( "0" ) ).toInt() );
Expand Down

0 comments on commit 095ac52

Please sign in to comment.