Change rendering parameter to point cloud attributes

This commit is contained in:
NEDJIMAbelgacem 2020-11-24 15:34:49 +01:00 committed by Martin Dobias
parent 376671215a
commit 5e76bc6fcb
12 changed files with 183 additions and 129 deletions

View File

@ -37,7 +37,7 @@ class QgsPointCloud3DSymbol : QgsAbstract3DSymbol
ColorRamp,
};
QgsPointCloud3DSymbol( QgsPointCloud3DSymbol::RenderingStyle style );
QgsPointCloud3DSymbol( QgsPointCloudLayer *layer, QgsPointCloud3DSymbol::RenderingStyle style );
%Docstring
Constructor for QgsPointCloud3DSymbol
%End
@ -50,6 +50,18 @@ Constructor for QgsPointCloud3DSymbol
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
QgsPointCloud3DSymbol::RenderingStyle renderingStyle() const;
%Docstring
Returns the rendering style used to render the point cloud
@ -75,7 +87,7 @@ class QgsNoRenderingPointCloud3DSymbol : QgsPointCloud3DSymbol
#include "qgspointcloud3dsymbol.h"
%End
public:
QgsNoRenderingPointCloud3DSymbol();
QgsNoRenderingPointCloud3DSymbol( QgsPointCloudLayer *layer );
virtual QgsAbstract3DSymbol *clone() const /Factory/;
@ -103,7 +115,7 @@ class QgsSingleColorPointCloud3DSymbol : QgsPointCloud3DSymbol
#include "qgspointcloud3dsymbol.h"
%End
public:
QgsSingleColorPointCloud3DSymbol();
QgsSingleColorPointCloud3DSymbol( QgsPointCloudLayer *layer );
virtual QgsAbstract3DSymbol *clone() const /Factory/;
@ -160,14 +172,7 @@ class QgsColorRampPointCloud3DSymbol : QgsPointCloud3DSymbol
#include "qgspointcloud3dsymbol.h"
%End
public:
enum RenderingParameter
{
Height,
ClassID
};
QgsColorRampPointCloud3DSymbol();
QgsColorRampPointCloud3DSymbol( QgsPointCloudLayer *layer );
virtual QgsAbstract3DSymbol *clone() const /Factory/;
@ -191,14 +196,14 @@ Sets the point size
.. seealso:: :py:func:`pointSize`
%End
QgsColorRampPointCloud3DSymbol::RenderingParameter renderingParameter() const;
QString renderingParameter() const;
%Docstring
Returns the parameter used to select the color of the point cloud
.. seealso:: :py:func:`setRenderingParameter`
%End
void setRenderingParameter( QgsColorRampPointCloud3DSymbol::RenderingParameter parameter );
void setRenderingParameter( const QString &parameter );
%Docstring
Sets the parameter used to select the color of the point cloud
@ -208,11 +213,15 @@ Sets the parameter used to select the color of the point cloud
QgsColorRampShader colorRampShader() const;
%Docstring
Returns the color ramp shader used to render the color
.. seealso:: :py:func:`setColorRampShader`
%End
void setColorRampShader( const QgsColorRampShader &colorRampShader );
%Docstring
Sets the color ramp shader used to render the point cloud
.. seealso:: :py:func:`colorRampShader`
%End
double colorRampShaderMin() const;

View File

@ -51,6 +51,8 @@ QgsPointCloudLayer3DRenderer::QgsPointCloudLayer3DRenderer( )
void QgsPointCloudLayer3DRenderer::setLayer( QgsPointCloudLayer *layer )
{
mLayerRef = QgsMapLayerRef( layer );
if ( mSymbol )
mSymbol->setLayer( layer );
}
QgsPointCloudLayer *QgsPointCloudLayer3DRenderer::layer() const
@ -117,13 +119,13 @@ void QgsPointCloudLayer3DRenderer::readXml( const QDomElement &elem, const QgsRe
switch ( renderingStyle )
{
case QgsPointCloud3DSymbol::RenderingStyle::NoRendering:
mSymbol.reset( new QgsSingleColorPointCloud3DSymbol );
mSymbol.reset( new QgsNoRenderingPointCloud3DSymbol( layer() ) );
break;
case QgsPointCloud3DSymbol::RenderingStyle::SingleColor:
mSymbol.reset( new QgsSingleColorPointCloud3DSymbol );
mSymbol.reset( new QgsSingleColorPointCloud3DSymbol( layer() ) );
break;
case QgsPointCloud3DSymbol::RenderingStyle::ColorRamp:
mSymbol.reset( new QgsColorRampPointCloud3DSymbol );
mSymbol.reset( new QgsColorRampPointCloud3DSymbol( layer() ) );
break;
}
mSymbol->readXml( elemSymbol, context );
@ -132,4 +134,5 @@ void QgsPointCloudLayer3DRenderer::readXml( const QDomElement &elem, const QgsRe
void QgsPointCloudLayer3DRenderer::resolveReferences( const QgsProject &project )
{
mLayerRef.setLayer( project.mapLayer( mLayerRef.layerId ) );
mSymbol->setLayer( layer() );
}

View File

@ -48,7 +48,7 @@
QgsPointCloud3DGeometry::QgsPointCloud3DGeometry( Qt3DCore::QNode *parent, const QgsPointCloud3DSymbolHandler::PointData &data )
: Qt3DRender::QGeometry( parent )
, mPositionAttribute( new Qt3DRender::QAttribute( this ) )
, mClassAttribute( new Qt3DRender::QAttribute( this ) )
, mParameterAttribute( new Qt3DRender::QAttribute( this ) )
#if QT_VERSION < QT_VERSION_CHECK(5, 10, 0)
, mVertexBuffer( new Qt3DRender::QBuffer( Qt3DRender::QBuffer::VertexBuffer, this ) )
#else
@ -63,17 +63,16 @@ QgsPointCloud3DGeometry::QgsPointCloud3DGeometry( Qt3DCore::QNode *parent, const
mPositionAttribute->setByteOffset( 0 );
mPositionAttribute->setByteStride( 16 );
mClassAttribute->setAttributeType( Qt3DRender::QAttribute::VertexAttribute );
mClassAttribute->setBuffer( mVertexBuffer );
mClassAttribute->setVertexBaseType( Qt3DRender::QAttribute::Float );
mClassAttribute->setVertexSize( 1 );
mClassAttribute->setName( "cls" );
mClassAttribute->setByteOffset( 12 );
mClassAttribute->setByteStride( 16 );
mParameterAttribute->setAttributeType( Qt3DRender::QAttribute::VertexAttribute );
mParameterAttribute->setBuffer( mVertexBuffer );
mParameterAttribute->setVertexBaseType( Qt3DRender::QAttribute::Float );
mParameterAttribute->setVertexSize( 1 );
mParameterAttribute->setName( "vertexParameter" );
mParameterAttribute->setByteOffset( 12 );
mParameterAttribute->setByteStride( 16 );
addAttribute( mPositionAttribute );
addAttribute( mClassAttribute );
addAttribute( mParameterAttribute );
makeVertexBuffer( data );
}
@ -84,13 +83,13 @@ void QgsPointCloud3DGeometry::makeVertexBuffer( const QgsPointCloud3DSymbolHandl
vertexBufferData.resize( data.positions.size() * 4 * sizeof( float ) );
float *rawVertexArray = reinterpret_cast<float *>( vertexBufferData.data() );
int idx = 0;
Q_ASSERT( data.positions.count() == data.classes.count() );
Q_ASSERT( data.positions.count() == data.parameter.count() );
for ( int i = 0; i < data.positions.size(); ++i )
{
rawVertexArray[idx++] = data.positions.at( i ).x();
rawVertexArray[idx++] = data.positions.at( i ).y();
rawVertexArray[idx++] = data.positions.at( i ).z();
rawVertexArray[idx++] = data.classes.at( i );
rawVertexArray[idx++] = data.parameter.at( i );
}
mVertexCount = data.positions.size();
@ -115,7 +114,26 @@ void QgsPointCloud3DSymbolHandler::processNode( QgsPointCloudIndex *pc, const In
attributes.push_back( QgsPointCloudAttribute( QStringLiteral( "X" ), QgsPointCloudAttribute::Int32 ) );
attributes.push_back( QgsPointCloudAttribute( QStringLiteral( "Y" ), QgsPointCloudAttribute::Int32 ) );
attributes.push_back( QgsPointCloudAttribute( QStringLiteral( "Z" ), QgsPointCloudAttribute::Int32 ) );
attributes.push_back( QgsPointCloudAttribute( QStringLiteral( "Classification" ), QgsPointCloudAttribute::Char ) );
std::unique_ptr< QgsPointCloudAttribute > parameterAttribute;
if ( mSymbol.get()->renderingStyle() == QgsPointCloud3DSymbol::ColorRamp )
{
QgsColorRampPointCloud3DSymbol *symbol = dynamic_cast<QgsColorRampPointCloud3DSymbol *>( mSymbol.get() );
QgsPointCloudLayer *layer = symbol->layer();
if ( symbol && layer )
{
int offset = 0;
const QgsPointCloudAttribute *attr = layer->attributes().find( symbol->renderingParameter(), offset );
if ( attr )
{
parameterAttribute.reset( new QgsPointCloudAttribute( attr->name(), attr->type() ) );
attributes.push_back( *parameterAttribute.get() );
}
}
}
// attributes.push_back( QgsPointCloudAttribute( QStringLiteral( "Classification" ), QgsPointCloudAttribute::Char ) );
QgsPointCloudRequest request;
request.setAttributes( attributes );
std::unique_ptr<QgsPointCloudBlock> block( pc->nodeData( n, request ) );
@ -134,7 +152,28 @@ void QgsPointCloud3DSymbolHandler::processNode( QgsPointCloudIndex *pc, const In
qint32 ix = *( qint32 * )( ptr + i * recordSize + 0 );
qint32 iy = *( qint32 * )( ptr + i * recordSize + 4 );
qint32 iz = *( qint32 * )( ptr + i * recordSize + 8 );
char cls = *( char * )( ptr + i * recordSize + 12 );
float iParam = 0.0f;
if ( parameterAttribute )
{
switch ( parameterAttribute->type() )
{
case QgsPointCloudAttribute::DataType::Char:
iParam = *( char * )( ptr + i * recordSize + 12 );
break;
case QgsPointCloudAttribute::DataType::Float:
iParam = *( float * )( ptr + i * recordSize + 12 );
break;
case QgsPointCloudAttribute::DataType::Int32:
iParam = *( qint32 * )( ptr + i * recordSize + 12 );
break;
case QgsPointCloudAttribute::DataType::Short:
iParam = *( short * )( ptr + i * recordSize + 12 );
break;
case QgsPointCloudAttribute::DataType::Double:
iParam = *( double * )( ptr + i * recordSize + 12 );
break;
}
}
double x = offset.x() + scale.x() * ix;
double y = offset.y() + scale.y() * iy;
@ -142,8 +181,11 @@ void QgsPointCloud3DSymbolHandler::processNode( QgsPointCloudIndex *pc, const In
QVector3D point( x, y, z );
QgsVector3D p = context.map().mapToWorldCoordinates( point );
outNormal.positions.push_back( QVector3D( p.x(), p.y(), p.z() ) );
outNormal.classes.push_back( cls );
outNormal.parameter.push_back( iParam );
}
qDebug() << "outNormal.positions.size() " << outNormal.positions.size();
qDebug() << "outNormal.parameter.size() " << outNormal.parameter.size();
qDebug() << "--------------------------------------------------";
}
void QgsPointCloud3DSymbolHandler::finalize( Qt3DCore::QEntity *parent, const Qgs3DRenderContext &context )
@ -263,8 +305,8 @@ 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 *renderingParameter = new Qt3DRender::QParameter( "u_renderingParameter", symbol->renderingParameter() );
mat->addParameter( renderingParameter );
// Qt3DRender::QParameter *renderingParameter = new Qt3DRender::QParameter( "u_renderingParameter", symbol->renderingParameter() );
// mat->addParameter( renderingParameter );
QgsColorRampShader colorRampShader = symbol->colorRampShader();
// Create the texture to pass the color ramp
Qt3DRender::QTexture1D *colorRampTexture = nullptr;

View File

@ -64,7 +64,7 @@ class QgsPointCloud3DSymbolHandler // : public QgsFeature3DHandler
struct PointData
{
QVector<QVector3D> positions; // contains triplets of float x,y,z for each point
QVector<char> classes;
QVector<float> parameter;
};
protected:
@ -105,7 +105,7 @@ class QgsPointCloud3DGeometry: public Qt3DRender::QGeometry
void makeVertexBuffer( const QgsPointCloud3DSymbolHandler::PointData &data );
Qt3DRender::QAttribute *mPositionAttribute = nullptr;
Qt3DRender::QAttribute *mClassAttribute = nullptr;
Qt3DRender::QAttribute *mParameterAttribute = nullptr;
Qt3DRender::QBuffer *mVertexBuffer = nullptr;
int mVertexCount = 0;
};

View File

@ -1,7 +1,6 @@
#version 150
in float magnitude;
in float clsid;
in float parameter;
out vec4 color;
@ -16,29 +15,29 @@ uniform sampler1D u_colorRampTexture; //
// Sets the color ramp value count, used to check the if not void
uniform int u_colorRampCount; //
vec4 clsidBasedRendering()
{
vec4 color;
if ( abs(clsid-2) < 0.1 ) // ground
color = vec4(1,1,0,1);
else if ( abs( clsid - 3 ) < 0.1 ) // low vegetation
color = vec4(0,0.4,0,1);
else if ( abs( clsid - 4 ) < 0.1 ) // medium vegetation
color = vec4(0,0.6,0,1);
else if ( abs( clsid - 5 ) < 0.1 ) // high vegetation
color = vec4(0,1,0,1);
else if ( abs( clsid - 12 ) < 0.1 ) // overlaps
{
color = vec4(1,0,0,1);
discard; // skip overlaps
}
else
{
color = vec4(0,1,1,1);
//discard;
}
return color;
}
//vec4 clsidBasedRendering()
//{
// vec4 color;
// if ( abs(clsid-2) < 0.1 ) // ground
// color = vec4(1,1,0,1);
// else if ( abs( clsid - 3 ) < 0.1 ) // low vegetation
// color = vec4(0,0.4,0,1);
// else if ( abs( clsid - 4 ) < 0.1 ) // medium vegetation
// color = vec4(0,0.6,0,1);
// else if ( abs( clsid - 5 ) < 0.1 ) // high vegetation
// color = vec4(0,1,0,1);
// else if ( abs( clsid - 12 ) < 0.1 ) // overlaps
// {
// color = vec4(1,0,0,1);
// discard; // skip overlaps
// }
// else
// {
// color = vec4(0,1,1,1);
// //discard;
// }
// return color;
//}
vec3 linearColorRamp()
{
@ -62,12 +61,12 @@ vec3 linearColorRamp()
float value1=colorRampLine1.x;
float value2=colorRampLine2.x;
if (magnitude<=value1 )
if (parameter <= value1 )
return color1;
if (magnitude>value1 && magnitude<=value2)
if (parameter > value1 && parameter <= value2)
{
float mixValue=(magnitude-value1)/(value2-value1);
float mixValue=(parameter - value1)/(value2-value1);
return mix(color1,color2,mixValue);
}
}
@ -89,7 +88,7 @@ vec3 discreteColorRamp()
vec4 colorRampLine=texelFetch(u_colorRampTexture,i,0);
color=colorRampLine.yzw;
float value=colorRampLine.x;
if ( isinf(value) || magnitude<value)
if ( isinf(value) || parameter < value)
return color;
}
@ -105,7 +104,7 @@ vec3 exactColorRamp()
vec4 colorRampLine = texelFetch( u_colorRampTexture, i, 0 );
vec3 color=colorRampLine.yzw;
float value=colorRampLine.x;
if ( abs( magnitude - value ) < 0.01 )
if ( abs( parameter - value ) < 0.01 )
return color;
}

View File

@ -9,10 +9,9 @@ uniform float u_pointSize;
uniform int u_renderingParameter;
in vec3 vertexPosition;
in float cls;
in float vertexParameter;
out float magnitude;
out float clsid;
out float parameter;
void main(void)
{
@ -24,15 +23,6 @@ void main(void)
gl_PointSize = u_pointSize; //5 + vertexPosition.x * 10 + vertexPosition.y * 10;
//gl_PointSize = viewportMatrix[1][1] * projectionMatrix[1][1] * 1.0 / gl_Position.w;
//gl_PointSize = 100.0;
switch (u_renderingParameter)
{
case 0:
magnitude = vertexPosition.y;
break;
case 1:
magnitude = cls;
break;
}
clsid = cls;
parameter = vertexParameter;
}

View File

@ -17,24 +17,30 @@
// QgsPointCloud3DSymbol
QgsPointCloud3DSymbol::QgsPointCloud3DSymbol( QgsPointCloud3DSymbol::RenderingStyle style )
QgsPointCloud3DSymbol::QgsPointCloud3DSymbol( QgsPointCloudLayer *layer, QgsPointCloud3DSymbol::RenderingStyle style )
: QgsAbstract3DSymbol()
, mRenderingStyle( style )
, mLayer( layer )
{
}
QgsPointCloud3DSymbol::~QgsPointCloud3DSymbol() { }
void QgsPointCloud3DSymbol::setLayer( QgsPointCloudLayer *layer )
{
mLayer = layer;
}
// QgsNoRenderingPointCloud3DSymbol
QgsNoRenderingPointCloud3DSymbol::QgsNoRenderingPointCloud3DSymbol()
: QgsPointCloud3DSymbol( QgsPointCloud3DSymbol::RenderingStyle::NoRendering )
QgsNoRenderingPointCloud3DSymbol::QgsNoRenderingPointCloud3DSymbol( QgsPointCloudLayer *layer )
: QgsPointCloud3DSymbol( layer, QgsPointCloud3DSymbol::RenderingStyle::NoRendering )
{
}
QgsAbstract3DSymbol *QgsNoRenderingPointCloud3DSymbol::clone() const
{
QgsNoRenderingPointCloud3DSymbol *result = new QgsNoRenderingPointCloud3DSymbol;
QgsNoRenderingPointCloud3DSymbol *result = new QgsNoRenderingPointCloud3DSymbol( mLayer );
result->mRenderingStyle = mRenderingStyle;
copyBaseSettings( result );
return result;
@ -54,15 +60,15 @@ void QgsNoRenderingPointCloud3DSymbol::readXml( const QDomElement &elem, const Q
// QgsSingleColorPointCloud3DSymbol
QgsSingleColorPointCloud3DSymbol::QgsSingleColorPointCloud3DSymbol()
: QgsPointCloud3DSymbol( QgsPointCloud3DSymbol::RenderingStyle::SingleColor )
QgsSingleColorPointCloud3DSymbol::QgsSingleColorPointCloud3DSymbol( QgsPointCloudLayer *layer )
: QgsPointCloud3DSymbol( layer, QgsPointCloud3DSymbol::RenderingStyle::SingleColor )
{
}
QgsAbstract3DSymbol *QgsSingleColorPointCloud3DSymbol::clone() const
{
QgsSingleColorPointCloud3DSymbol *result = new QgsSingleColorPointCloud3DSymbol;
QgsSingleColorPointCloud3DSymbol *result = new QgsSingleColorPointCloud3DSymbol( mLayer );
result->mPointSize = mPointSize;
result->mRenderingStyle = mRenderingStyle;
result->mSingleColor = mSingleColor;
@ -104,15 +110,15 @@ void QgsSingleColorPointCloud3DSymbol::setSingleColor( QColor color )
// QgsColorRampPointCloud3DSymbol
QgsColorRampPointCloud3DSymbol::QgsColorRampPointCloud3DSymbol()
: QgsPointCloud3DSymbol( QgsPointCloud3DSymbol::RenderingStyle::ColorRamp )
QgsColorRampPointCloud3DSymbol::QgsColorRampPointCloud3DSymbol( QgsPointCloudLayer *layer )
: QgsPointCloud3DSymbol( layer, QgsPointCloud3DSymbol::RenderingStyle::ColorRamp )
{
}
QgsAbstract3DSymbol *QgsColorRampPointCloud3DSymbol::clone() const
{
QgsColorRampPointCloud3DSymbol *result = new QgsColorRampPointCloud3DSymbol;
QgsColorRampPointCloud3DSymbol *result = new QgsColorRampPointCloud3DSymbol( mLayer );
result->mPointSize = mPointSize;
result->mRenderingStyle = mRenderingStyle;
result->mRenderingParameter = mRenderingParameter;
@ -143,18 +149,18 @@ void QgsColorRampPointCloud3DSymbol::readXml( const QDomElement &elem, const Qgs
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() );
mRenderingParameter = elem.attribute( "rendering-parameter", QStringLiteral( "0" ) );
mColorRampShaderMin = elem.attribute( QStringLiteral( "color-ramp-shader-min" ), QStringLiteral( "0.0" ) ).toDouble();
mColorRampShaderMax = elem.attribute( QStringLiteral( "color-ramp-shader-max" ), QStringLiteral( "1.0" ) ).toDouble();
mColorRampShader.readXml( elem );
}
QgsColorRampPointCloud3DSymbol::RenderingParameter QgsColorRampPointCloud3DSymbol::renderingParameter() const
QString QgsColorRampPointCloud3DSymbol::renderingParameter() const
{
return mRenderingParameter;
}
void QgsColorRampPointCloud3DSymbol::setRenderingParameter( QgsColorRampPointCloud3DSymbol::RenderingParameter parameter )
void QgsColorRampPointCloud3DSymbol::setRenderingParameter( const QString &parameter )
{
mRenderingParameter = parameter;
}

View File

@ -20,6 +20,7 @@
#include "qgsabstract3dsymbol.h"
#include "qgscolorrampshader.h"
#include "qgspointcloudlayer.h"
/**
* \ingroup 3d
@ -48,7 +49,7 @@ class _3D_EXPORT QgsPointCloud3DSymbol : public QgsAbstract3DSymbol
};
//! Constructor for QgsPointCloud3DSymbol
QgsPointCloud3DSymbol( QgsPointCloud3DSymbol::RenderingStyle style );
QgsPointCloud3DSymbol( QgsPointCloudLayer *layer, QgsPointCloud3DSymbol::RenderingStyle style );
//! Destructor for QgsPointCloud3DSymbol
~QgsPointCloud3DSymbol() override;
@ -59,11 +60,24 @@ class _3D_EXPORT QgsPointCloud3DSymbol : public QgsAbstract3DSymbol
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 rendering style used to render the point cloud
QgsPointCloud3DSymbol::RenderingStyle renderingStyle() const { return mRenderingStyle; }
protected:
QgsPointCloud3DSymbol::RenderingStyle mRenderingStyle = QgsPointCloud3DSymbol::NoRendering;
QgsPointCloudLayer *mLayer = nullptr;
};
/**
@ -78,7 +92,7 @@ class _3D_EXPORT QgsPointCloud3DSymbol : public QgsAbstract3DSymbol
class _3D_EXPORT QgsNoRenderingPointCloud3DSymbol : public QgsPointCloud3DSymbol
{
public:
QgsNoRenderingPointCloud3DSymbol();
QgsNoRenderingPointCloud3DSymbol( QgsPointCloudLayer *layer );
QgsAbstract3DSymbol *clone() const override SIP_FACTORY;
@ -98,7 +112,7 @@ class _3D_EXPORT QgsNoRenderingPointCloud3DSymbol : public QgsPointCloud3DSymbol
class _3D_EXPORT QgsSingleColorPointCloud3DSymbol : public QgsPointCloud3DSymbol
{
public:
QgsSingleColorPointCloud3DSymbol();
QgsSingleColorPointCloud3DSymbol( QgsPointCloudLayer *layer );
QgsAbstract3DSymbol *clone() const override SIP_FACTORY;
@ -146,17 +160,7 @@ class _3D_EXPORT QgsSingleColorPointCloud3DSymbol : public QgsPointCloud3DSymbol
class _3D_EXPORT QgsColorRampPointCloud3DSymbol : public QgsPointCloud3DSymbol
{
public:
/**
* The value used to select colors from the color ramp
*/
enum RenderingParameter
{
Height = 0,
ClassID
};
QgsColorRampPointCloud3DSymbol();
QgsColorRampPointCloud3DSymbol( QgsPointCloudLayer *layer );
QgsAbstract3DSymbol *clone() const override SIP_FACTORY;
@ -179,21 +183,23 @@ class _3D_EXPORT QgsColorRampPointCloud3DSymbol : public QgsPointCloud3DSymbol
* Returns the parameter used to select the color of the point cloud
* \see setRenderingParameter( QgsColorRampPointCloud3DSymbol::RenderingParameter parameter )
*/
QgsColorRampPointCloud3DSymbol::RenderingParameter renderingParameter() const;
QString renderingParameter() const;
/**
* Sets the parameter used to select the color of the point cloud
* \see renderingParameter()
*/
void setRenderingParameter( QgsColorRampPointCloud3DSymbol::RenderingParameter parameter );
void setRenderingParameter( const QString &parameter );
/**
* Returns the color ramp shader used to render the color
* \see setColorRampShader( const QgsColorRampShader &colorRampShader )
*/
QgsColorRampShader colorRampShader() const;
/**
* Sets the color ramp shader used to render the point cloud
* \see colorRampShader()
*/
void setColorRampShader( const QgsColorRampShader &colorRampShader );
@ -217,7 +223,7 @@ class _3D_EXPORT QgsColorRampPointCloud3DSymbol : public QgsPointCloud3DSymbol
private:
float mPointSize = 2.0f;
QgsColorRampPointCloud3DSymbol::RenderingParameter mRenderingParameter = QgsColorRampPointCloud3DSymbol::RenderingParameter::Height;
QString mRenderingParameter;
QgsColorRampShader mColorRampShader;
double mColorRampShaderMin = 0.0;
double mColorRampShaderMax = 1.0;

View File

@ -19,13 +19,19 @@
#include "qgspointcloud3dsymbol.h"
#include "qgspointcloudlayer3drenderer.h"
QgsPointCloud3DSymbolWidget::QgsPointCloud3DSymbolWidget( QgsPointCloud3DSymbol *symbol, QWidget *parent )
QgsPointCloud3DSymbolWidget::QgsPointCloud3DSymbolWidget( QgsPointCloudLayer *layer, QgsPointCloud3DSymbol *symbol, QWidget *parent )
: QWidget( parent )
, mLayer( layer )
{
setupUi( this );
mPointSizeSpinBox->setClearValue( 2.0 );
for ( QgsPointCloudAttribute attr : layer->attributes().attributes() )
{
mRenderingParameterComboBox->addItem( attr.name() );
}
if ( symbol )
setSymbol( symbol );
@ -53,7 +59,7 @@ void QgsPointCloud3DSymbolWidget::setSymbol( QgsPointCloud3DSymbol *symbol )
{
QgsColorRampPointCloud3DSymbol *symb = static_cast<QgsColorRampPointCloud3DSymbol *>( symbol );
mPointSizeSpinBox->setValue( symb->pointSize() );
mRenderingParameterComboBox->setCurrentIndex( symb->renderingParameter() );
mRenderingParameterComboBox->setCurrentText( symb->renderingParameter() );
QgsColorRampShader shader = symb->colorRampShader();
setColorRampMinMax( symb->colorRampShaderMin(), symb->colorRampShaderMax() );
mColorRampShaderWidget->setFromShader( symb->colorRampShader() );
@ -74,12 +80,12 @@ QgsPointCloud3DSymbol *QgsPointCloud3DSymbolWidget::symbol() const
{
case QgsPointCloud3DSymbol::RenderingStyle::NoRendering:
{
ret_symb = new QgsNoRenderingPointCloud3DSymbol;
ret_symb = new QgsNoRenderingPointCloud3DSymbol( mLayer );
break;
}
case QgsPointCloud3DSymbol::RenderingStyle::SingleColor:
{
QgsSingleColorPointCloud3DSymbol *symb = new QgsSingleColorPointCloud3DSymbol;
QgsSingleColorPointCloud3DSymbol *symb = new QgsSingleColorPointCloud3DSymbol( mLayer );
symb->setPointSize( mPointSizeSpinBox->value() );
symb->setSingleColor( mSingleColorBtn->color() );
ret_symb = symb;
@ -87,8 +93,8 @@ QgsPointCloud3DSymbol *QgsPointCloud3DSymbolWidget::symbol() const
}
case QgsPointCloud3DSymbol::RenderingStyle::ColorRamp:
{
QgsColorRampPointCloud3DSymbol *symb = new QgsColorRampPointCloud3DSymbol;
symb->setRenderingParameter( static_cast< QgsColorRampPointCloud3DSymbol::RenderingParameter >( mRenderingParameterComboBox->currentIndex() ) );
QgsColorRampPointCloud3DSymbol *symb = new QgsColorRampPointCloud3DSymbol( mLayer );
symb->setRenderingParameter( mRenderingParameterComboBox->currentText() );
symb->setPointSize( mPointSizeSpinBox->value() );
symb->setColorRampShader( mColorRampShaderWidget->shader() );
symb->setColorRampShaderMinMax( mColorRampShaderMinEdit->value(), mColorRampShaderMaxEdit->value() );

View File

@ -26,7 +26,7 @@ class QgsPointCloud3DSymbolWidget : public QWidget, private Ui::QgsPointCloud3DS
Q_OBJECT
public:
explicit QgsPointCloud3DSymbolWidget( QgsPointCloud3DSymbol *symbol, QWidget *parent = nullptr );
explicit QgsPointCloud3DSymbolWidget( QgsPointCloudLayer *layer, QgsPointCloud3DSymbol *symbol, QWidget *parent = nullptr );
void setSymbol( QgsPointCloud3DSymbol *symbol );
@ -41,6 +41,10 @@ class QgsPointCloud3DSymbolWidget : public QWidget, private Ui::QgsPointCloud3DS
private:
void setColorRampMinMax( double min, double max );
private:
QgsPointCloudLayer *mLayer = nullptr;
};
#endif // QGSPOINTCLOUD3DSYMBOLWIDGET_H

View File

@ -32,7 +32,7 @@ QgsPointCloudLayer3DRendererWidget::QgsPointCloudLayer3DRendererWidget( QgsPoint
QVBoxLayout *layout = new QVBoxLayout( this );
layout->setContentsMargins( 0, 0, 0, 0 );
mWidgetPointCloudSymbol = new QgsPointCloud3DSymbolWidget( nullptr, this );
mWidgetPointCloudSymbol = new QgsPointCloud3DSymbolWidget( layer, nullptr, this );
layout->addWidget( mWidgetPointCloudSymbol );
connect( mWidgetPointCloudSymbol, &QgsPointCloud3DSymbolWidget::changed, this, &QgsPointCloudLayer3DRendererWidget::widgetChanged );

View File

@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
<height>310</height>
</rect>
</property>
<layout class="QGridLayout" name="gridLayout">
@ -175,18 +175,7 @@
</widget>
</item>
<item row="0" column="2" colspan="3">
<widget class="QComboBox" name="mRenderingParameterComboBox">
<item>
<property name="text">
<string>Height</string>
</property>
</item>
<item>
<property name="text">
<string>ClassID</string>
</property>
</item>
</widget>
<widget class="QComboBox" name="mRenderingParameterComboBox"/>
</item>
<item row="0" column="0" colspan="2">
<widget class="QLabel" name="label_5">