QGIS API Documentation 3.99.0-Master (d270888f95f)
Loading...
Searching...
No Matches
qgspointcloud3dsymbol.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgspointcloud3dsymbol.h
3 ------------------------------
4 Date : November 2020
5 Copyright : (C) 2020 by Nedjima Belgacem
6 Email : belgacem dot nedjima at gmail dot com
7 ***************************************************************************
8 * *
9 * This program is free software; you can redistribute it and/or modify *
10 * it under the terms of the GNU General Public License as published by *
11 * the Free Software Foundation; either version 2 of the License, or *
12 * (at your option) any later version. *
13 * *
14 ***************************************************************************/
15
17
18#include "qgscolorramptexture.h"
19#include "qgscolorutils.h"
20#include "qgsmaterial.h"
21
22#include <QString>
23#include <Qt3DRender/QParameter>
24#include <Qt3DRender/QTexture>
25
26using namespace Qt::StringLiterals;
27
28// QgsPointCloud3DSymbol
29
30
35
37
39{
40 mPointSize = size;
41}
42
47
49{
50 mRenderAsTriangles = asTriangles;
51}
52
57
62
67
72
77
82
87
92
93void QgsPointCloud3DSymbol::writeBaseXml( QDomElement &elem, const QgsReadWriteContext &context ) const
94{
95 Q_UNUSED( context )
96
97 elem.setAttribute( u"point-size"_s, mPointSize );
98 elem.setAttribute( u"render-as-triangles"_s, mRenderAsTriangles ? 1 : 0 );
99 elem.setAttribute( u"horizontal-triangle-filter"_s, mHorizontalTriangleFilter ? 1 : 0 );
100 elem.setAttribute( u"horizontal-filter-threshold"_s, mHorizontalFilterThreshold );
101 elem.setAttribute( u"vertical-triangle-filter"_s, mVerticalTriangleFilter ? 1 : 0 );
102 elem.setAttribute( u"vertical-filter-threshold"_s, mVerticalFilterThreshold );
103}
104
105void QgsPointCloud3DSymbol::readBaseXml( const QDomElement &elem, const QgsReadWriteContext &context )
106{
107 Q_UNUSED( context )
108
109 mPointSize = elem.attribute( u"point-size"_s, u"3.0"_s ).toFloat();
110 mRenderAsTriangles = elem.attribute( u"render-as-triangles"_s, u"0"_s ).toInt() == 1;
111 mHorizontalTriangleFilter = elem.attribute( u"horizontal-triangle-filter"_s, u"0"_s ).toInt() == 1;
112 mHorizontalFilterThreshold = elem.attribute( u"horizontal-filter-threshold"_s, u"10.0"_s ).toFloat();
113 mVerticalTriangleFilter = elem.attribute( u"vertical-triangle-filter"_s, u"0"_s ).toInt() == 1;
114 mVerticalFilterThreshold = elem.attribute( u"vertical-filter-threshold"_s, u"10.0"_s ).toFloat();
115}
116
128
129// QgsSingleColorPointCloud3DSymbol
130
135
137{
138 return u"single-color"_s;
139}
140
142{
144 result->mSingleColor = mSingleColor;
145 copyBaseSettings( result );
146 return result;
147}
148
149void QgsSingleColorPointCloud3DSymbol::writeXml( QDomElement &elem, const QgsReadWriteContext &context ) const
150{
151 Q_UNUSED( context )
152
153 writeBaseXml( elem, context );
154 elem.setAttribute( u"single-color"_s, QgsColorUtils::colorToString( mSingleColor ) );
155}
156
157void QgsSingleColorPointCloud3DSymbol::readXml( const QDomElement &elem, const QgsReadWriteContext &context )
158{
159 Q_UNUSED( context )
160
161 readBaseXml( elem, context );
162 mSingleColor = QgsColorUtils::colorFromString( elem.attribute( u"single-color"_s, u"0,0,255"_s ) );
163}
164
166{
167 mSingleColor = color;
168}
169
171{
172 Qt3DRender::QParameter *renderingStyle = new Qt3DRender::QParameter( "u_renderingStyle", QgsPointCloud3DSymbol::SingleColor );
173 mat->addParameter( renderingStyle );
174 Qt3DRender::QParameter *pointSizeParameter = new Qt3DRender::QParameter( "u_pointSize", QVariant::fromValue( mPointSize ) );
175 mat->addParameter( pointSizeParameter );
176 Qt3DRender::QParameter *singleColorParameter = new Qt3DRender::QParameter( "u_singleColor", QVector3D( mSingleColor.redF(), mSingleColor.greenF(), mSingleColor.blueF() ) );
177 mat->addParameter( singleColorParameter );
178}
179
180// QgsColorRampPointCloud3DSymbol
181
186
188{
190 result->mRenderingParameter = mRenderingParameter;
191 result->mColorRampShader = mColorRampShader;
192 result->mColorRampShaderMin = mColorRampShaderMin;
193 result->mColorRampShaderMax = mColorRampShaderMax;
194 copyBaseSettings( result );
195 return result;
196}
197
199{
200 return u"color-ramp"_s;
201}
202
203void QgsColorRampPointCloud3DSymbol::writeXml( QDomElement &elem, const QgsReadWriteContext &context ) const
204{
205 Q_UNUSED( context )
206
207 writeBaseXml( elem, context );
208 elem.setAttribute( u"rendering-parameter"_s, mRenderingParameter );
209 elem.setAttribute( u"color-ramp-shader-min"_s, mColorRampShaderMin );
210 elem.setAttribute( u"color-ramp-shader-max"_s, mColorRampShaderMax );
211 QDomDocument doc = elem.ownerDocument();
212 const QDomElement elemColorRampShader = mColorRampShader.writeXml( doc );
213 elem.appendChild( elemColorRampShader );
214}
215
216void QgsColorRampPointCloud3DSymbol::readXml( const QDomElement &elem, const QgsReadWriteContext &context )
217{
218 Q_UNUSED( context )
219
220 readBaseXml( elem, context );
221 mRenderingParameter = elem.attribute( "rendering-parameter", QString() );
222 mColorRampShaderMin = elem.attribute( u"color-ramp-shader-min"_s, u"0.0"_s ).toDouble();
223 mColorRampShaderMax = elem.attribute( u"color-ramp-shader-max"_s, u"1.0"_s ).toDouble();
224 mColorRampShader.readXml( elem );
225}
226
228{
229 return mRenderingParameter;
230}
231
232void QgsColorRampPointCloud3DSymbol::setAttribute( const QString &parameter )
233{
234 mRenderingParameter = parameter;
235}
236
238{
239 return mColorRampShader;
240}
241
246
248{
249 mColorRampShaderMin = min;
250 mColorRampShaderMax = max;
251}
252
254{
255 Qt3DRender::QParameter *renderingStyle = new Qt3DRender::QParameter( "u_renderingStyle", QgsPointCloud3DSymbol::ColorRamp );
256 mat->addParameter( renderingStyle );
257 Qt3DRender::QParameter *pointSizeParameter = new Qt3DRender::QParameter( "u_pointSize", QVariant::fromValue( mPointSize ) );
258 mat->addParameter( pointSizeParameter );
259 // Create the texture to pass the color ramp
260 Qt3DRender::QTexture1D *colorRampTexture = nullptr;
261 if ( mColorRampShader.colorRampItemList().count() > 0 )
262 {
263 colorRampTexture = new Qt3DRender::QTexture1D( mat );
264 colorRampTexture->addTextureImage( new QgsColorRampTexture( mColorRampShader, 1 ) );
265 colorRampTexture->setMinificationFilter( Qt3DRender::QTexture1D::Linear );
266 colorRampTexture->setMagnificationFilter( Qt3DRender::QTexture1D::Linear );
267 }
268
269 // Parameters
270 Qt3DRender::QParameter *colorRampTextureParameter = new Qt3DRender::QParameter( "u_colorRampTexture", colorRampTexture );
271 mat->addParameter( colorRampTextureParameter );
272 Qt3DRender::QParameter *colorRampCountParameter = new Qt3DRender::QParameter( "u_colorRampCount", mColorRampShader.colorRampItemList().count() );
273 mat->addParameter( colorRampCountParameter );
274 const Qgis::ShaderInterpolationMethod colorRampType = mColorRampShader.colorRampType();
275 Qt3DRender::QParameter *colorRampTypeParameter = new Qt3DRender::QParameter( "u_colorRampType", static_cast<int>( colorRampType ) );
276 mat->addParameter( colorRampTypeParameter );
277}
278
279// QgsRgbPointCloud3DSymbol
280
285
287{
288 return u"rgb"_s;
289}
290
292{
294 result->mRedAttribute = mRedAttribute;
295 result->mGreenAttribute = mGreenAttribute;
296 result->mBlueAttribute = mBlueAttribute;
297
298 if ( mRedContrastEnhancement )
299 {
300 result->setRedContrastEnhancement( new QgsContrastEnhancement( *mRedContrastEnhancement ) );
301 }
302 if ( mGreenContrastEnhancement )
303 {
304 result->setGreenContrastEnhancement( new QgsContrastEnhancement( *mGreenContrastEnhancement ) );
305 }
306 if ( mBlueContrastEnhancement )
307 {
308 result->setBlueContrastEnhancement( new QgsContrastEnhancement( *mBlueContrastEnhancement ) );
309 }
310 copyBaseSettings( result );
311 return result;
312}
313
314void QgsRgbPointCloud3DSymbol::writeXml( QDomElement &elem, const QgsReadWriteContext &context ) const
315{
316 Q_UNUSED( context )
317
318 writeBaseXml( elem, context );
319
320 elem.setAttribute( u"red"_s, mRedAttribute );
321 elem.setAttribute( u"green"_s, mGreenAttribute );
322 elem.setAttribute( u"blue"_s, mBlueAttribute );
323
324 QDomDocument doc = elem.ownerDocument();
325
326 //contrast enhancement
327 if ( mRedContrastEnhancement )
328 {
329 QDomElement redContrastElem = doc.createElement( u"redContrastEnhancement"_s );
330 mRedContrastEnhancement->writeXml( doc, redContrastElem );
331 elem.appendChild( redContrastElem );
332 }
333 if ( mGreenContrastEnhancement )
334 {
335 QDomElement greenContrastElem = doc.createElement( u"greenContrastEnhancement"_s );
336 mGreenContrastEnhancement->writeXml( doc, greenContrastElem );
337 elem.appendChild( greenContrastElem );
338 }
339 if ( mBlueContrastEnhancement )
340 {
341 QDomElement blueContrastElem = doc.createElement( u"blueContrastEnhancement"_s );
342 mBlueContrastEnhancement->writeXml( doc, blueContrastElem );
343 elem.appendChild( blueContrastElem );
344 }
345}
346
347void QgsRgbPointCloud3DSymbol::readXml( const QDomElement &elem, const QgsReadWriteContext &context )
348{
349 Q_UNUSED( context )
350
351 readBaseXml( elem, context );
352
353 setRedAttribute( elem.attribute( u"red"_s, u"Red"_s ) );
354 setGreenAttribute( elem.attribute( u"green"_s, u"Green"_s ) );
355 setBlueAttribute( elem.attribute( u"blue"_s, u"Blue"_s ) );
356
357 //contrast enhancements
359 const QDomElement redContrastElem = elem.firstChildElement( u"redContrastEnhancement"_s );
360 if ( !redContrastElem.isNull() )
361 {
363 redContrastEnhancement->readXml( redContrastElem );
365 }
366
368 const QDomElement greenContrastElem = elem.firstChildElement( u"greenContrastEnhancement"_s );
369 if ( !greenContrastElem.isNull() )
370 {
372 greenContrastEnhancement->readXml( greenContrastElem );
374 }
375
377 const QDomElement blueContrastElem = elem.firstChildElement( u"blueContrastEnhancement"_s );
378 if ( !blueContrastElem.isNull() )
379 {
381 blueContrastEnhancement->readXml( blueContrastElem );
383 }
384}
385
387{
388 Qt3DRender::QParameter *renderingStyle = new Qt3DRender::QParameter( "u_renderingStyle", QgsPointCloud3DSymbol::RgbRendering );
389 mat->addParameter( renderingStyle );
390 Qt3DRender::QParameter *pointSizeParameter = new Qt3DRender::QParameter( "u_pointSize", QVariant::fromValue( mPointSize ) );
391 mat->addParameter( pointSizeParameter );
392}
393
394
396{
397 return mRedAttribute;
398}
399
401{
402 mRedAttribute = redAttribute;
403}
404
406{
407 return mGreenAttribute;
408}
409
411{
412 mGreenAttribute = greenAttribute;
413}
414
416{
417 return mBlueAttribute;
418}
419
421{
422 mBlueAttribute = blueAttribute;
423}
424
426{
427 return mRedContrastEnhancement.get();
428}
429
431{
432 mRedContrastEnhancement.reset( enhancement );
433}
434
436{
437 return mGreenContrastEnhancement.get();
438}
439
441{
442 mGreenContrastEnhancement.reset( enhancement );
443}
444
446{
447 return mBlueContrastEnhancement.get();
448}
449
451{
452 mBlueContrastEnhancement.reset( enhancement );
453}
454
455// QgsClassificationPointCloud3DSymbol
456
457
462
464{
466 result->mRenderingParameter = mRenderingParameter;
467 result->mCategoriesList = mCategoriesList;
468 copyBaseSettings( result );
469 return result;
470}
471
473{
474 return u"classification"_s;
475}
476
477void QgsClassificationPointCloud3DSymbol::writeXml( QDomElement &elem, const QgsReadWriteContext &context ) const
478{
479 Q_UNUSED( context )
480 QDomDocument doc = elem.ownerDocument();
481
482 writeBaseXml( elem, context );
483
484 elem.setAttribute( u"rendering-parameter"_s, mRenderingParameter );
485
486 // categories
487 QDomElement catsElem = doc.createElement( u"categories"_s );
488 for ( const QgsPointCloudCategory &category : mCategoriesList )
489 {
490 QDomElement catElem = doc.createElement( u"category"_s );
491 catElem.setAttribute( u"value"_s, QString::number( category.value() ) );
492 catElem.setAttribute( u"pointSize"_s, category.pointSize() );
493 catElem.setAttribute( u"label"_s, category.label() );
494 catElem.setAttribute( u"color"_s, QgsColorUtils::colorToString( category.color() ) );
495 catElem.setAttribute( u"render"_s, category.renderState() ? "true" : "false" );
496 catsElem.appendChild( catElem );
497 }
498 elem.appendChild( catsElem );
499}
500
501void QgsClassificationPointCloud3DSymbol::readXml( const QDomElement &elem, const QgsReadWriteContext &context )
502{
503 Q_UNUSED( context )
504
505 readBaseXml( elem, context );
506 mRenderingParameter = elem.attribute( "rendering-parameter", QString() );
507
508 const QDomElement catsElem = elem.firstChildElement( u"categories"_s );
509 if ( !catsElem.isNull() )
510 {
511 mCategoriesList.clear();
512 QDomElement catElem = catsElem.firstChildElement();
513 while ( !catElem.isNull() )
514 {
515 if ( catElem.tagName() == "category"_L1 )
516 {
517 const int value = catElem.attribute( u"value"_s ).toInt();
518 const double size = catElem.attribute( u"pointSize"_s, u"0"_s ).toDouble();
519 const QString label = catElem.attribute( u"label"_s );
520 const bool render = catElem.attribute( u"render"_s ) != "false"_L1;
521 const QColor color = QgsColorUtils::colorFromString( catElem.attribute( u"color"_s ) );
522 mCategoriesList.append( QgsPointCloudCategory( value, color, label, render, size ) );
523 }
524 catElem = catElem.nextSiblingElement();
525 }
526 }
527}
528
530{
531 return mRenderingParameter;
532}
533
535{
536 mRenderingParameter = attribute;
537}
538
540{
541 mCategoriesList = categories;
542}
543
545{
546 QgsPointCloudCategoryList filteredOut;
547 for ( const QgsPointCloudCategory &category : mCategoriesList )
548 {
549 if ( !category.renderState() )
550 filteredOut.push_back( category );
551 }
552 return filteredOut;
553}
554
555QgsColorRampShader QgsClassificationPointCloud3DSymbol::colorRampShader() const
556{
557 QgsColorRampShader colorRampShader;
560 QList<QgsColorRampShader::ColorRampItem> colorRampItemList;
561 for ( const QgsPointCloudCategory &category : mCategoriesList )
562 {
563 const QColor color = category.color();
564 const QgsColorRampShader::ColorRampItem item( category.value(), color, category.label() );
565 colorRampItemList.push_back( item );
566 }
567 colorRampShader.setColorRampItemList( colorRampItemList );
568 return colorRampShader;
569}
570
571
573{
574 const QgsColorRampShader mColorRampShader = colorRampShader();
575 Qt3DRender::QParameter *renderingStyle = new Qt3DRender::QParameter( "u_renderingStyle", QgsPointCloud3DSymbol::Classification );
576 mat->addParameter( renderingStyle );
577 Qt3DRender::QParameter *pointSizeParameter = new Qt3DRender::QParameter( "u_pointSize", QVariant::fromValue( mPointSize ) );
578 mat->addParameter( pointSizeParameter );
579 // Create the texture to pass the color ramp
580 Qt3DRender::QTexture1D *colorRampTexture = nullptr;
581 if ( mColorRampShader.colorRampItemList().count() > 0 )
582 {
583 colorRampTexture = new Qt3DRender::QTexture1D( mat );
584 colorRampTexture->addTextureImage( new QgsColorRampTexture( mColorRampShader, 1 ) );
585 colorRampTexture->setMinificationFilter( Qt3DRender::QTexture1D::Linear );
586 colorRampTexture->setMagnificationFilter( Qt3DRender::QTexture1D::Linear );
587 }
588
589 // Parameters
590 Qt3DRender::QParameter *colorRampTextureParameter = new Qt3DRender::QParameter( "u_colorRampTexture", colorRampTexture );
591 mat->addParameter( colorRampTextureParameter );
592 Qt3DRender::QParameter *colorRampCountParameter = new Qt3DRender::QParameter( "u_colorRampCount", mColorRampShader.colorRampItemList().count() );
593 mat->addParameter( colorRampCountParameter );
594 const Qgis::ShaderInterpolationMethod colorRampType = mColorRampShader.colorRampType();
595 Qt3DRender::QParameter *colorRampTypeParameter = new Qt3DRender::QParameter( "u_colorRampType", static_cast<int>( colorRampType ) );
596 mat->addParameter( colorRampTypeParameter );
597}
ShaderInterpolationMethod
Color ramp shader interpolation methods.
Definition qgis.h:1483
@ Exact
Assigns the color of the exact matching value in the color ramp item list.
Definition qgis.h:1486
@ Continuous
Uses breaks from color palette.
Definition qgis.h:1499
@ UnknownDataType
Unknown or unspecified type.
Definition qgis.h:380
Abstract base class for 3D symbols that are used by VectorLayer3DRenderer objects.
virtual void copyBaseSettings(QgsAbstract3DSymbol *destination) const
Copies base class settings from this object to a destination object.
void readXml(const QDomElement &elem, const QgsReadWriteContext &context) override
void writeXml(QDomElement &elem, const QgsReadWriteContext &context) const override
void fillMaterial(QgsMaterial *material) override SIP_SKIP
Used to fill material object with necessary QParameters (and consequently opengl uniforms).
QString attribute() const
Returns the attribute used to select the color of the point cloud.
void setCategoriesList(const QgsPointCloudCategoryList &categories)
Sets the list of categories of the classification.
QgsPointCloudCategoryList getFilteredOutCategories() const
Gets the list of categories of the classification that should not be rendered.
void setAttribute(const QString &attribute)
Sets the attribute used to select the color of the point cloud.
QString symbolType() const override
Returns a unique string identifier of the symbol type.
QgsClassificationPointCloud3DSymbol * clone() const override SIP_FACTORY
QgsColorRampPointCloud3DSymbol * clone() const override SIP_FACTORY
void readXml(const QDomElement &elem, const QgsReadWriteContext &context) override
void setAttribute(const QString &attribute)
Sets the attribute used to select the color of the point cloud.
void writeXml(QDomElement &elem, const QgsReadWriteContext &context) const override
void setColorRampShaderMinMax(double min, double max)
Sets the minimum and maximum values used when classifying colors in the color ramp shader.
QString attribute() const
Returns the attribute used to select the color of the point cloud.
QString symbolType() const override
Returns a unique string identifier of the symbol type.
QgsColorRampShader colorRampShader() const
Returns the color ramp shader used to render the color.
void setColorRampShader(const QgsColorRampShader &colorRampShader)
Sets the color ramp shader used to render the point cloud.
void fillMaterial(QgsMaterial *material) override SIP_SKIP
Used to fill material object with necessary QParameters (and consequently opengl uniforms).
A ramp shader will color a raster pixel based on a list of values ranges in a ramp.
Qgis::ShaderInterpolationMethod colorRampType() const
Returns the color ramp interpolation method.
void setClassificationMode(Qgis::ShaderClassificationMethod classificationMode)
Sets the classification mode.
QList< QgsColorRampShader::ColorRampItem > colorRampItemList() const
Returns the custom color map.
void setColorRampType(Qgis::ShaderInterpolationMethod colorRampType)
Sets the color ramp interpolation method.
static QColor colorFromString(const QString &string)
Decodes a string into a color value.
static QString colorToString(const QColor &color)
Encodes a color into a string value.
Handles contrast enhancement and clipping.
Base class for all materials used within QGIS 3D views.
Definition qgsmaterial.h:39
bool verticalTriangleFilter() const
Returns whether triangles are filtered by vertical height for rendering.
float verticalFilterThreshold() const
Returns the threshold vertical height value for filtering triangles.
void setVerticalTriangleFilter(bool verticalTriangleFilter)
Sets whether triangles are filtered by vertical height for rendering.
void setHorizontalFilterThreshold(float horizontalFilterThreshold)
Sets the threshold horizontal size value for filtering triangles.
void setRenderAsTriangles(bool asTriangles)
Sets whether points are triangulated to render solid surface.
float horizontalFilterThreshold() const
Returns the threshold horizontal size value for filtering triangles.
void copyBaseSettings(QgsAbstract3DSymbol *destination) const override
bool renderAsTriangles() const
Returns whether points are triangulated to render solid surface.
void setPointSize(float size)
Sets the point size.
void writeBaseXml(QDomElement &elem, const QgsReadWriteContext &context) const
Writes symbol configuration of this class to the given DOM element.
@ Classification
Render the point cloud with classified colors.
@ SingleColor
Render the point cloud with a single color.
@ ColorRamp
Render the point cloud with a color ramp.
@ RgbRendering
Render the RGB colors of the point cloud.
void setHorizontalTriangleFilter(bool horizontalTriangleFilter)
Sets whether whether triangles are filtered by horizontal size for rendering.
bool horizontalTriangleFilter() const
Returns whether triangles are filtered by horizontal size for rendering.
void readBaseXml(const QDomElement &elem, const QgsReadWriteContext &context)
Reads symbol configuration of this class from the given DOM element.
void setVerticalFilterThreshold(float verticalFilterThreshold)
Sets the threshold vertical height value for filtering triangles.
Represents an individual category (class) from a QgsPointCloudClassifiedRenderer.
A container for the context for various read/write operations on objects.
QString blueAttribute() const
Returns the attribute to use for the blue channel.
void readXml(const QDomElement &elem, const QgsReadWriteContext &context) override
void setBlueAttribute(const QString &attribute)
Sets the attribute to use for the blue channel.
void setGreenContrastEnhancement(QgsContrastEnhancement *enhancement SIP_TRANSFER)
Sets the contrast enhancement to use for the green channel.
QString greenAttribute() const
Returns the attribute to use for the green channel.
QgsContrastEnhancement * blueContrastEnhancement()
Returns the contrast enhancement to use for the blue channel.
void setGreenAttribute(const QString &attribute)
Sets the attribute to use for the green channel.
QString redAttribute() const
Returns the attribute to use for the red channel.
void setBlueContrastEnhancement(QgsContrastEnhancement *enhancement SIP_TRANSFER)
Sets the contrast enhancement to use for the blue channel.
QgsContrastEnhancement * greenContrastEnhancement()
Returns the contrast enhancement to use for the green channel.
QgsContrastEnhancement * redContrastEnhancement()
Returns the contrast enhancement to use for the red channel.
void setRedContrastEnhancement(QgsContrastEnhancement *enhancement SIP_TRANSFER)
Sets the contrast enhancement to use for the red channel.
QString symbolType() const override
Returns a unique string identifier of the symbol type.
QgsRgbPointCloud3DSymbol * clone() const override SIP_FACTORY
void writeXml(QDomElement &elem, const QgsReadWriteContext &context) const override
void fillMaterial(QgsMaterial *material) override SIP_SKIP
Used to fill material object with necessary QParameters (and consequently opengl uniforms).
void setRedAttribute(const QString &attribute)
Sets the attribute to use for the red channel.
QString symbolType() const override
Returns a unique string identifier of the symbol type.
void fillMaterial(QgsMaterial *material) override SIP_SKIP
Used to fill material object with necessary QParameters (and consequently opengl uniforms).
void readXml(const QDomElement &elem, const QgsReadWriteContext &context) override
void writeXml(QDomElement &elem, const QgsReadWriteContext &context) const override
QgsSingleColorPointCloud3DSymbol * clone() const override SIP_FACTORY
void setSingleColor(QColor color)
Sets the color used by the renderer when using SingleColor rendering mode.
QList< QgsPointCloudCategory > QgsPointCloudCategoryList