QGIS API Documentation 4.0.0-Norrköping (1ddcee3d0e4)
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
34
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
134
136{
137 return u"single-color"_s;
138}
139
141{
143 result->mSingleColor = mSingleColor;
144 copyBaseSettings( result );
145 return result;
146}
147
148void QgsSingleColorPointCloud3DSymbol::writeXml( QDomElement &elem, const QgsReadWriteContext &context ) const
149{
150 Q_UNUSED( context )
151
152 writeBaseXml( elem, context );
153 elem.setAttribute( u"single-color"_s, QgsColorUtils::colorToString( mSingleColor ) );
154}
155
156void QgsSingleColorPointCloud3DSymbol::readXml( const QDomElement &elem, const QgsReadWriteContext &context )
157{
158 Q_UNUSED( context )
159
160 readBaseXml( elem, context );
161 mSingleColor = QgsColorUtils::colorFromString( elem.attribute( u"single-color"_s, u"0,0,255"_s ) );
162}
163
165{
166 mSingleColor = color;
167}
168
170{
171 Qt3DRender::QParameter *renderingStyle = new Qt3DRender::QParameter( "u_renderingStyle", QgsPointCloud3DSymbol::SingleColor );
172 mat->addParameter( renderingStyle );
173 Qt3DRender::QParameter *pointSizeParameter = new Qt3DRender::QParameter( "u_pointSize", QVariant::fromValue( mPointSize ) );
174 mat->addParameter( pointSizeParameter );
175 Qt3DRender::QParameter *singleColorParameter = new Qt3DRender::QParameter( "u_singleColor", QVector3D( mSingleColor.redF(), mSingleColor.greenF(), mSingleColor.blueF() ) );
176 mat->addParameter( singleColorParameter );
177}
178
179// QgsColorRampPointCloud3DSymbol
180
184
186{
188 result->mRenderingParameter = mRenderingParameter;
189 result->mColorRampShader = mColorRampShader;
190 result->mColorRampShaderMin = mColorRampShaderMin;
191 result->mColorRampShaderMax = mColorRampShaderMax;
192 copyBaseSettings( result );
193 return result;
194}
195
197{
198 return u"color-ramp"_s;
199}
200
201void QgsColorRampPointCloud3DSymbol::writeXml( QDomElement &elem, const QgsReadWriteContext &context ) const
202{
203 Q_UNUSED( context )
204
205 writeBaseXml( elem, context );
206 elem.setAttribute( u"rendering-parameter"_s, mRenderingParameter );
207 elem.setAttribute( u"color-ramp-shader-min"_s, mColorRampShaderMin );
208 elem.setAttribute( u"color-ramp-shader-max"_s, mColorRampShaderMax );
209 QDomDocument doc = elem.ownerDocument();
210 const QDomElement elemColorRampShader = mColorRampShader.writeXml( doc );
211 elem.appendChild( elemColorRampShader );
212}
213
214void QgsColorRampPointCloud3DSymbol::readXml( const QDomElement &elem, const QgsReadWriteContext &context )
215{
216 Q_UNUSED( context )
217
218 readBaseXml( elem, context );
219 mRenderingParameter = elem.attribute( "rendering-parameter", QString() );
220 mColorRampShaderMin = elem.attribute( u"color-ramp-shader-min"_s, u"0.0"_s ).toDouble();
221 mColorRampShaderMax = elem.attribute( u"color-ramp-shader-max"_s, u"1.0"_s ).toDouble();
222 mColorRampShader.readXml( elem );
223}
224
226{
227 return mRenderingParameter;
228}
229
230void QgsColorRampPointCloud3DSymbol::setAttribute( const QString &parameter )
231{
232 mRenderingParameter = parameter;
233}
234
236{
237 return mColorRampShader;
238}
239
244
246{
247 mColorRampShaderMin = min;
248 mColorRampShaderMax = max;
249}
250
252{
253 Qt3DRender::QParameter *renderingStyle = new Qt3DRender::QParameter( "u_renderingStyle", QgsPointCloud3DSymbol::ColorRamp );
254 mat->addParameter( renderingStyle );
255 Qt3DRender::QParameter *pointSizeParameter = new Qt3DRender::QParameter( "u_pointSize", QVariant::fromValue( mPointSize ) );
256 mat->addParameter( pointSizeParameter );
257 // Create the texture to pass the color ramp
258 Qt3DRender::QTexture1D *colorRampTexture = nullptr;
259 if ( mColorRampShader.colorRampItemList().count() > 0 )
260 {
261 colorRampTexture = new Qt3DRender::QTexture1D( mat );
262 colorRampTexture->addTextureImage( new QgsColorRampTexture( mColorRampShader, 1 ) );
263 colorRampTexture->setMinificationFilter( Qt3DRender::QTexture1D::Linear );
264 colorRampTexture->setMagnificationFilter( Qt3DRender::QTexture1D::Linear );
265 }
266
267 // Parameters
268 Qt3DRender::QParameter *colorRampTextureParameter = new Qt3DRender::QParameter( "u_colorRampTexture", colorRampTexture );
269 mat->addParameter( colorRampTextureParameter );
270 Qt3DRender::QParameter *colorRampCountParameter = new Qt3DRender::QParameter( "u_colorRampCount", mColorRampShader.colorRampItemList().count() );
271 mat->addParameter( colorRampCountParameter );
272 const Qgis::ShaderInterpolationMethod colorRampType = mColorRampShader.colorRampType();
273 Qt3DRender::QParameter *colorRampTypeParameter = new Qt3DRender::QParameter( "u_colorRampType", static_cast<int>( colorRampType ) );
274 mat->addParameter( colorRampTypeParameter );
275}
276
277// QgsRgbPointCloud3DSymbol
278
282
284{
285 return u"rgb"_s;
286}
287
289{
291 result->mRedAttribute = mRedAttribute;
292 result->mGreenAttribute = mGreenAttribute;
293 result->mBlueAttribute = mBlueAttribute;
294
295 if ( mRedContrastEnhancement )
296 {
297 result->setRedContrastEnhancement( new QgsContrastEnhancement( *mRedContrastEnhancement ) );
298 }
299 if ( mGreenContrastEnhancement )
300 {
301 result->setGreenContrastEnhancement( new QgsContrastEnhancement( *mGreenContrastEnhancement ) );
302 }
303 if ( mBlueContrastEnhancement )
304 {
305 result->setBlueContrastEnhancement( new QgsContrastEnhancement( *mBlueContrastEnhancement ) );
306 }
307 copyBaseSettings( result );
308 return result;
309}
310
311void QgsRgbPointCloud3DSymbol::writeXml( QDomElement &elem, const QgsReadWriteContext &context ) const
312{
313 Q_UNUSED( context )
314
315 writeBaseXml( elem, context );
316
317 elem.setAttribute( u"red"_s, mRedAttribute );
318 elem.setAttribute( u"green"_s, mGreenAttribute );
319 elem.setAttribute( u"blue"_s, mBlueAttribute );
320
321 QDomDocument doc = elem.ownerDocument();
322
323 //contrast enhancement
324 if ( mRedContrastEnhancement )
325 {
326 QDomElement redContrastElem = doc.createElement( u"redContrastEnhancement"_s );
327 mRedContrastEnhancement->writeXml( doc, redContrastElem );
328 elem.appendChild( redContrastElem );
329 }
330 if ( mGreenContrastEnhancement )
331 {
332 QDomElement greenContrastElem = doc.createElement( u"greenContrastEnhancement"_s );
333 mGreenContrastEnhancement->writeXml( doc, greenContrastElem );
334 elem.appendChild( greenContrastElem );
335 }
336 if ( mBlueContrastEnhancement )
337 {
338 QDomElement blueContrastElem = doc.createElement( u"blueContrastEnhancement"_s );
339 mBlueContrastEnhancement->writeXml( doc, blueContrastElem );
340 elem.appendChild( blueContrastElem );
341 }
342}
343
344void QgsRgbPointCloud3DSymbol::readXml( const QDomElement &elem, const QgsReadWriteContext &context )
345{
346 Q_UNUSED( context )
347
348 readBaseXml( elem, context );
349
350 setRedAttribute( elem.attribute( u"red"_s, u"Red"_s ) );
351 setGreenAttribute( elem.attribute( u"green"_s, u"Green"_s ) );
352 setBlueAttribute( elem.attribute( u"blue"_s, u"Blue"_s ) );
353
354 //contrast enhancements
356 const QDomElement redContrastElem = elem.firstChildElement( u"redContrastEnhancement"_s );
357 if ( !redContrastElem.isNull() )
358 {
360 redContrastEnhancement->readXml( redContrastElem );
362 }
363
365 const QDomElement greenContrastElem = elem.firstChildElement( u"greenContrastEnhancement"_s );
366 if ( !greenContrastElem.isNull() )
367 {
369 greenContrastEnhancement->readXml( greenContrastElem );
371 }
372
374 const QDomElement blueContrastElem = elem.firstChildElement( u"blueContrastEnhancement"_s );
375 if ( !blueContrastElem.isNull() )
376 {
378 blueContrastEnhancement->readXml( blueContrastElem );
380 }
381}
382
384{
385 Qt3DRender::QParameter *renderingStyle = new Qt3DRender::QParameter( "u_renderingStyle", QgsPointCloud3DSymbol::RgbRendering );
386 mat->addParameter( renderingStyle );
387 Qt3DRender::QParameter *pointSizeParameter = new Qt3DRender::QParameter( "u_pointSize", QVariant::fromValue( mPointSize ) );
388 mat->addParameter( pointSizeParameter );
389}
390
391
393{
394 return mRedAttribute;
395}
396
398{
399 mRedAttribute = redAttribute;
400}
401
403{
404 return mGreenAttribute;
405}
406
408{
409 mGreenAttribute = greenAttribute;
410}
411
413{
414 return mBlueAttribute;
415}
416
418{
419 mBlueAttribute = blueAttribute;
420}
421
423{
424 return mRedContrastEnhancement.get();
425}
426
428{
429 mRedContrastEnhancement.reset( enhancement );
430}
431
433{
434 return mGreenContrastEnhancement.get();
435}
436
438{
439 mGreenContrastEnhancement.reset( enhancement );
440}
441
443{
444 return mBlueContrastEnhancement.get();
445}
446
448{
449 mBlueContrastEnhancement.reset( enhancement );
450}
451
452// QgsClassificationPointCloud3DSymbol
453
454
458
460{
462 result->mRenderingParameter = mRenderingParameter;
463 result->mCategoriesList = mCategoriesList;
464 copyBaseSettings( result );
465 return result;
466}
467
469{
470 return u"classification"_s;
471}
472
473void QgsClassificationPointCloud3DSymbol::writeXml( QDomElement &elem, const QgsReadWriteContext &context ) const
474{
475 Q_UNUSED( context )
476 QDomDocument doc = elem.ownerDocument();
477
478 writeBaseXml( elem, context );
479
480 elem.setAttribute( u"rendering-parameter"_s, mRenderingParameter );
481
482 // categories
483 QDomElement catsElem = doc.createElement( u"categories"_s );
484 for ( const QgsPointCloudCategory &category : mCategoriesList )
485 {
486 QDomElement catElem = doc.createElement( u"category"_s );
487 catElem.setAttribute( u"value"_s, QString::number( category.value() ) );
488 catElem.setAttribute( u"pointSize"_s, category.pointSize() );
489 catElem.setAttribute( u"label"_s, category.label() );
490 catElem.setAttribute( u"color"_s, QgsColorUtils::colorToString( category.color() ) );
491 catElem.setAttribute( u"render"_s, category.renderState() ? "true" : "false" );
492 catsElem.appendChild( catElem );
493 }
494 elem.appendChild( catsElem );
495}
496
497void QgsClassificationPointCloud3DSymbol::readXml( const QDomElement &elem, const QgsReadWriteContext &context )
498{
499 Q_UNUSED( context )
500
501 readBaseXml( elem, context );
502 mRenderingParameter = elem.attribute( "rendering-parameter", QString() );
503
504 const QDomElement catsElem = elem.firstChildElement( u"categories"_s );
505 if ( !catsElem.isNull() )
506 {
507 mCategoriesList.clear();
508 QDomElement catElem = catsElem.firstChildElement();
509 while ( !catElem.isNull() )
510 {
511 if ( catElem.tagName() == "category"_L1 )
512 {
513 const int value = catElem.attribute( u"value"_s ).toInt();
514 const double size = catElem.attribute( u"pointSize"_s, u"0"_s ).toDouble();
515 const QString label = catElem.attribute( u"label"_s );
516 const bool render = catElem.attribute( u"render"_s ) != "false"_L1;
517 const QColor color = QgsColorUtils::colorFromString( catElem.attribute( u"color"_s ) );
518 mCategoriesList.append( QgsPointCloudCategory( value, color, label, render, size ) );
519 }
520 catElem = catElem.nextSiblingElement();
521 }
522 }
523}
524
526{
527 return mRenderingParameter;
528}
529
531{
532 mRenderingParameter = attribute;
533}
534
536{
537 mCategoriesList = categories;
538}
539
541{
542 QgsPointCloudCategoryList filteredOut;
543 for ( const QgsPointCloudCategory &category : mCategoriesList )
544 {
545 if ( !category.renderState() )
546 filteredOut.push_back( category );
547 }
548 return filteredOut;
549}
550
551QgsColorRampShader QgsClassificationPointCloud3DSymbol::colorRampShader() const
552{
553 QgsColorRampShader colorRampShader;
556 QList<QgsColorRampShader::ColorRampItem> colorRampItemList;
557 for ( const QgsPointCloudCategory &category : mCategoriesList )
558 {
559 const QColor color = category.color();
560 const QgsColorRampShader::ColorRampItem item( category.value(), color, category.label() );
561 colorRampItemList.push_back( item );
562 }
563 colorRampShader.setColorRampItemList( colorRampItemList );
564 return colorRampShader;
565}
566
567
569{
570 const QgsColorRampShader mColorRampShader = colorRampShader();
571 Qt3DRender::QParameter *renderingStyle = new Qt3DRender::QParameter( "u_renderingStyle", QgsPointCloud3DSymbol::Classification );
572 mat->addParameter( renderingStyle );
573 Qt3DRender::QParameter *pointSizeParameter = new Qt3DRender::QParameter( "u_pointSize", QVariant::fromValue( mPointSize ) );
574 mat->addParameter( pointSizeParameter );
575 // Create the texture to pass the color ramp
576 Qt3DRender::QTexture1D *colorRampTexture = nullptr;
577 if ( mColorRampShader.colorRampItemList().count() > 0 )
578 {
579 colorRampTexture = new Qt3DRender::QTexture1D( mat );
580 colorRampTexture->addTextureImage( new QgsColorRampTexture( mColorRampShader, 1 ) );
581 colorRampTexture->setMinificationFilter( Qt3DRender::QTexture1D::Linear );
582 colorRampTexture->setMagnificationFilter( Qt3DRender::QTexture1D::Linear );
583 }
584
585 // Parameters
586 Qt3DRender::QParameter *colorRampTextureParameter = new Qt3DRender::QParameter( "u_colorRampTexture", colorRampTexture );
587 mat->addParameter( colorRampTextureParameter );
588 Qt3DRender::QParameter *colorRampCountParameter = new Qt3DRender::QParameter( "u_colorRampCount", mColorRampShader.colorRampItemList().count() );
589 mat->addParameter( colorRampCountParameter );
590 const Qgis::ShaderInterpolationMethod colorRampType = mColorRampShader.colorRampType();
591 Qt3DRender::QParameter *colorRampTypeParameter = new Qt3DRender::QParameter( "u_colorRampType", static_cast<int>( colorRampType ) );
592 mat->addParameter( colorRampTypeParameter );
593}
ShaderInterpolationMethod
Color ramp shader interpolation methods.
Definition qgis.h:1503
@ Exact
Assigns the color of the exact matching value in the color ramp item list.
Definition qgis.h:1506
@ Continuous
Uses breaks from color palette.
Definition qgis.h:1519
@ UnknownDataType
Unknown or unspecified type.
Definition qgis.h:394
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:40
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