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 
16 #include "qgspointcloud3dsymbol.h"
17 
18 #include "qgscolorramptexture.h"
19 #include "qgssymbollayerutils.h"
20 
21 #include <Qt3DRender/QMaterial>
22 #include <Qt3DRender/QParameter>
23 #include <Qt3DRender/QTexture>
24 
25 // QgsPointCloud3DSymbol
26 
27 
QgsPointCloud3DSymbol()28 QgsPointCloud3DSymbol::QgsPointCloud3DSymbol()
29   : QgsAbstract3DSymbol()
30 {
31 }
32 
~QgsPointCloud3DSymbol()33 QgsPointCloud3DSymbol::~QgsPointCloud3DSymbol() {  }
34 
setPointSize(float size)35 void QgsPointCloud3DSymbol::setPointSize( float size )
36 {
37   mPointSize = size;
38 }
39 
40 // QgsSingleColorPointCloud3DSymbol
41 
QgsSingleColorPointCloud3DSymbol()42 QgsSingleColorPointCloud3DSymbol::QgsSingleColorPointCloud3DSymbol()
43   : QgsPointCloud3DSymbol()
44 {
45 
46 }
47 
symbolType() const48 QString QgsSingleColorPointCloud3DSymbol::symbolType() const
49 {
50   return QStringLiteral( "single-color" );
51 }
52 
clone() const53 QgsAbstract3DSymbol *QgsSingleColorPointCloud3DSymbol::clone() const
54 {
55   QgsSingleColorPointCloud3DSymbol *result = new QgsSingleColorPointCloud3DSymbol;
56   result->mPointSize = mPointSize;
57   result->mSingleColor = mSingleColor;
58   copyBaseSettings( result );
59   return result;
60 }
61 
writeXml(QDomElement & elem,const QgsReadWriteContext & context) const62 void QgsSingleColorPointCloud3DSymbol::writeXml( QDomElement &elem, const QgsReadWriteContext &context ) const
63 {
64   Q_UNUSED( context )
65 
66   elem.setAttribute( QStringLiteral( "point-size" ), mPointSize );
67   elem.setAttribute( QStringLiteral( "single-color" ), QgsSymbolLayerUtils::encodeColor( mSingleColor ) );
68 }
69 
readXml(const QDomElement & elem,const QgsReadWriteContext & context)70 void QgsSingleColorPointCloud3DSymbol::readXml( const QDomElement &elem, const QgsReadWriteContext &context )
71 {
72   Q_UNUSED( context )
73 
74   mPointSize = elem.attribute( QStringLiteral( "point-size" ), QStringLiteral( "2.0" ) ).toFloat();
75   mSingleColor = QgsSymbolLayerUtils::decodeColor( elem.attribute( QStringLiteral( "single-color" ), QStringLiteral( "0,0,255" ) ) );
76 }
77 
setSingleColor(QColor color)78 void QgsSingleColorPointCloud3DSymbol::setSingleColor( QColor color )
79 {
80   mSingleColor = color;
81 }
82 
fillMaterial(Qt3DRender::QMaterial * mat)83 void QgsSingleColorPointCloud3DSymbol::fillMaterial( Qt3DRender::QMaterial *mat )
84 {
85   Qt3DRender::QParameter *renderingStyle = new Qt3DRender::QParameter( "u_renderingStyle", QgsPointCloud3DSymbol::SingleColor );
86   mat->addParameter( renderingStyle );
87   Qt3DRender::QParameter *pointSizeParameter = new Qt3DRender::QParameter( "u_pointSize", QVariant::fromValue( mPointSize ) );
88   mat->addParameter( pointSizeParameter );
89   Qt3DRender::QParameter *singleColorParameter = new Qt3DRender::QParameter( "u_singleColor", QVector3D( mSingleColor.redF(), mSingleColor.greenF(), mSingleColor.blueF() ) );
90   mat->addParameter( singleColorParameter );
91 }
92 
93 // QgsColorRampPointCloud3DSymbol
94 
QgsColorRampPointCloud3DSymbol()95 QgsColorRampPointCloud3DSymbol::QgsColorRampPointCloud3DSymbol()
96   : QgsPointCloud3DSymbol()
97 {
98 
99 }
100 
clone() const101 QgsAbstract3DSymbol *QgsColorRampPointCloud3DSymbol::clone() const
102 {
103   QgsColorRampPointCloud3DSymbol *result = new QgsColorRampPointCloud3DSymbol;
104   result->mPointSize = mPointSize;
105   result->mRenderingParameter = mRenderingParameter;
106   result->mColorRampShader = mColorRampShader;
107   result->mColorRampShaderMin = mColorRampShaderMin;
108   result->mColorRampShaderMax = mColorRampShaderMax;
109   copyBaseSettings( result );
110   return result;
111 }
112 
symbolType() const113 QString QgsColorRampPointCloud3DSymbol::symbolType() const
114 {
115   return QStringLiteral( "color-ramp" );
116 }
117 
writeXml(QDomElement & elem,const QgsReadWriteContext & context) const118 void QgsColorRampPointCloud3DSymbol::writeXml( QDomElement &elem, const QgsReadWriteContext &context ) const
119 {
120   Q_UNUSED( context )
121 
122   elem.setAttribute( QStringLiteral( "point-size" ), mPointSize );
123   elem.setAttribute( QStringLiteral( "rendering-parameter" ), mRenderingParameter );
124   elem.setAttribute( QStringLiteral( "color-ramp-shader-min" ), mColorRampShaderMin );
125   elem.setAttribute( QStringLiteral( "color-ramp-shader-max" ), mColorRampShaderMax );
126   QDomDocument doc = elem.ownerDocument();
127   const QDomElement elemColorRampShader = mColorRampShader.writeXml( doc );
128   elem.appendChild( elemColorRampShader );
129 }
130 
readXml(const QDomElement & elem,const QgsReadWriteContext & context)131 void QgsColorRampPointCloud3DSymbol::readXml( const QDomElement &elem, const QgsReadWriteContext &context )
132 {
133   Q_UNUSED( context )
134 
135   mPointSize = elem.attribute( "point-size", QStringLiteral( "2.0" ) ).toFloat();
136   mRenderingParameter = elem.attribute( "rendering-parameter", QString() );
137   mColorRampShaderMin = elem.attribute( QStringLiteral( "color-ramp-shader-min" ), QStringLiteral( "0.0" ) ).toDouble();
138   mColorRampShaderMax = elem.attribute( QStringLiteral( "color-ramp-shader-max" ), QStringLiteral( "1.0" ) ).toDouble();
139   mColorRampShader.readXml( elem );
140 }
141 
attribute() const142 QString QgsColorRampPointCloud3DSymbol::attribute() const
143 {
144   return mRenderingParameter;
145 }
146 
setAttribute(const QString & parameter)147 void QgsColorRampPointCloud3DSymbol::setAttribute( const QString &parameter )
148 {
149   mRenderingParameter = parameter;
150 }
151 
colorRampShader() const152 QgsColorRampShader QgsColorRampPointCloud3DSymbol::colorRampShader() const
153 {
154   return mColorRampShader;
155 }
156 
setColorRampShader(const QgsColorRampShader & colorRampShader)157 void QgsColorRampPointCloud3DSymbol::setColorRampShader( const QgsColorRampShader &colorRampShader )
158 {
159   mColorRampShader = colorRampShader;
160 }
161 
setColorRampShaderMinMax(double min,double max)162 void QgsColorRampPointCloud3DSymbol::setColorRampShaderMinMax( double min, double max )
163 {
164   mColorRampShaderMin = min;
165   mColorRampShaderMax = max;
166 }
167 
fillMaterial(Qt3DRender::QMaterial * mat)168 void QgsColorRampPointCloud3DSymbol::fillMaterial( Qt3DRender::QMaterial *mat )
169 {
170   Qt3DRender::QParameter *renderingStyle = new Qt3DRender::QParameter( "u_renderingStyle", QgsPointCloud3DSymbol::ColorRamp );
171   mat->addParameter( renderingStyle );
172   Qt3DRender::QParameter *pointSizeParameter = new Qt3DRender::QParameter( "u_pointSize", QVariant::fromValue( mPointSize ) );
173   mat->addParameter( pointSizeParameter );
174   // Create the texture to pass the color ramp
175   Qt3DRender::QTexture1D *colorRampTexture = nullptr;
176   if ( mColorRampShader.colorRampItemList().count() > 0 )
177   {
178     colorRampTexture = new Qt3DRender::QTexture1D( mat );
179     colorRampTexture->addTextureImage( new QgsColorRampTexture( mColorRampShader, 1 ) );
180     colorRampTexture->setMinificationFilter( Qt3DRender::QTexture1D::Linear );
181     colorRampTexture->setMagnificationFilter( Qt3DRender::QTexture1D::Linear );
182   }
183 
184   // Parameters
185   Qt3DRender::QParameter *colorRampTextureParameter = new Qt3DRender::QParameter( "u_colorRampTexture", colorRampTexture );
186   mat->addParameter( colorRampTextureParameter );
187   Qt3DRender::QParameter *colorRampCountParameter = new Qt3DRender::QParameter( "u_colorRampCount", mColorRampShader.colorRampItemList().count() );
188   mat->addParameter( colorRampCountParameter );
189   const int colorRampType = mColorRampShader.colorRampType();
190   Qt3DRender::QParameter *colorRampTypeParameter = new Qt3DRender::QParameter( "u_colorRampType", colorRampType );
191   mat->addParameter( colorRampTypeParameter );
192 }
193 
194 // QgsRgbPointCloud3DSymbol
195 
QgsRgbPointCloud3DSymbol()196 QgsRgbPointCloud3DSymbol::QgsRgbPointCloud3DSymbol()
197   : QgsPointCloud3DSymbol()
198 {
199 
200 }
201 
symbolType() const202 QString QgsRgbPointCloud3DSymbol::symbolType() const
203 {
204   return QStringLiteral( "rgb" );
205 }
206 
clone() const207 QgsAbstract3DSymbol *QgsRgbPointCloud3DSymbol::clone() const
208 {
209   QgsRgbPointCloud3DSymbol *result = new QgsRgbPointCloud3DSymbol;
210   result->mPointSize = mPointSize;
211   result->mRedAttribute = mRedAttribute;
212   result->mGreenAttribute = mGreenAttribute;
213   result->mBlueAttribute = mBlueAttribute;
214 
215   if ( mRedContrastEnhancement )
216   {
217     result->setRedContrastEnhancement( new QgsContrastEnhancement( *mRedContrastEnhancement ) );
218   }
219   if ( mGreenContrastEnhancement )
220   {
221     result->setGreenContrastEnhancement( new QgsContrastEnhancement( *mGreenContrastEnhancement ) );
222   }
223   if ( mBlueContrastEnhancement )
224   {
225     result->setBlueContrastEnhancement( new QgsContrastEnhancement( *mBlueContrastEnhancement ) );
226   }
227   copyBaseSettings( result );
228   return result;
229 }
230 
writeXml(QDomElement & elem,const QgsReadWriteContext & context) const231 void QgsRgbPointCloud3DSymbol::writeXml( QDomElement &elem, const QgsReadWriteContext &context ) const
232 {
233   Q_UNUSED( context )
234   elem.setAttribute( QStringLiteral( "point-size" ), mPointSize );
235 
236   elem.setAttribute( QStringLiteral( "red" ), mRedAttribute );
237   elem.setAttribute( QStringLiteral( "green" ), mGreenAttribute );
238   elem.setAttribute( QStringLiteral( "blue" ), mBlueAttribute );
239 
240   QDomDocument doc = elem.ownerDocument();
241 
242   //contrast enhancement
243   if ( mRedContrastEnhancement )
244   {
245     QDomElement redContrastElem = doc.createElement( QStringLiteral( "redContrastEnhancement" ) );
246     mRedContrastEnhancement->writeXml( doc, redContrastElem );
247     elem.appendChild( redContrastElem );
248   }
249   if ( mGreenContrastEnhancement )
250   {
251     QDomElement greenContrastElem = doc.createElement( QStringLiteral( "greenContrastEnhancement" ) );
252     mGreenContrastEnhancement->writeXml( doc, greenContrastElem );
253     elem.appendChild( greenContrastElem );
254   }
255   if ( mBlueContrastEnhancement )
256   {
257     QDomElement blueContrastElem = doc.createElement( QStringLiteral( "blueContrastEnhancement" ) );
258     mBlueContrastEnhancement->writeXml( doc, blueContrastElem );
259     elem.appendChild( blueContrastElem );
260   }
261 }
262 
readXml(const QDomElement & elem,const QgsReadWriteContext & context)263 void QgsRgbPointCloud3DSymbol::readXml( const QDomElement &elem, const QgsReadWriteContext &context )
264 {
265   Q_UNUSED( context )
266   mPointSize = elem.attribute( "point-size", QStringLiteral( "2.0" ) ).toFloat();
267 
268   setRedAttribute( elem.attribute( QStringLiteral( "red" ), QStringLiteral( "Red" ) ) );
269   setGreenAttribute( elem.attribute( QStringLiteral( "green" ), QStringLiteral( "Green" ) ) );
270   setBlueAttribute( elem.attribute( QStringLiteral( "blue" ), QStringLiteral( "Blue" ) ) );
271 
272   //contrast enhancements
273   QgsContrastEnhancement *redContrastEnhancement = nullptr;
274   const QDomElement redContrastElem = elem.firstChildElement( QStringLiteral( "redContrastEnhancement" ) );
275   if ( !redContrastElem.isNull() )
276   {
277     redContrastEnhancement = new QgsContrastEnhancement( Qgis::DataType::UnknownDataType );
278     redContrastEnhancement->readXml( redContrastElem );
279     setRedContrastEnhancement( redContrastEnhancement );
280   }
281 
282   QgsContrastEnhancement *greenContrastEnhancement = nullptr;
283   const QDomElement greenContrastElem = elem.firstChildElement( QStringLiteral( "greenContrastEnhancement" ) );
284   if ( !greenContrastElem.isNull() )
285   {
286     greenContrastEnhancement = new QgsContrastEnhancement( Qgis::DataType::UnknownDataType );
287     greenContrastEnhancement->readXml( greenContrastElem );
288     setGreenContrastEnhancement( greenContrastEnhancement );
289   }
290 
291   QgsContrastEnhancement *blueContrastEnhancement = nullptr;
292   const QDomElement blueContrastElem = elem.firstChildElement( QStringLiteral( "blueContrastEnhancement" ) );
293   if ( !blueContrastElem.isNull() )
294   {
295     blueContrastEnhancement = new QgsContrastEnhancement( Qgis::DataType::UnknownDataType );
296     blueContrastEnhancement->readXml( blueContrastElem );
297     setBlueContrastEnhancement( blueContrastEnhancement );
298   }
299 }
300 
fillMaterial(Qt3DRender::QMaterial * mat)301 void QgsRgbPointCloud3DSymbol::fillMaterial( Qt3DRender::QMaterial *mat )
302 {
303   Qt3DRender::QParameter *renderingStyle = new Qt3DRender::QParameter( "u_renderingStyle", QgsPointCloud3DSymbol::RgbRendering );
304   mat->addParameter( renderingStyle );
305   Qt3DRender::QParameter *pointSizeParameter = new Qt3DRender::QParameter( "u_pointSize", QVariant::fromValue( mPointSize ) );
306   mat->addParameter( pointSizeParameter );
307 }
308 
309 
redAttribute() const310 QString QgsRgbPointCloud3DSymbol::redAttribute() const
311 {
312   return mRedAttribute;
313 }
314 
setRedAttribute(const QString & redAttribute)315 void QgsRgbPointCloud3DSymbol::setRedAttribute( const QString &redAttribute )
316 {
317   mRedAttribute = redAttribute;
318 }
319 
greenAttribute() const320 QString QgsRgbPointCloud3DSymbol::greenAttribute() const
321 {
322   return mGreenAttribute;
323 }
324 
setGreenAttribute(const QString & greenAttribute)325 void QgsRgbPointCloud3DSymbol::setGreenAttribute( const QString &greenAttribute )
326 {
327   mGreenAttribute = greenAttribute;
328 }
329 
blueAttribute() const330 QString QgsRgbPointCloud3DSymbol::blueAttribute() const
331 {
332   return mBlueAttribute;
333 }
334 
setBlueAttribute(const QString & blueAttribute)335 void QgsRgbPointCloud3DSymbol::setBlueAttribute( const QString &blueAttribute )
336 {
337   mBlueAttribute = blueAttribute;
338 }
339 
redContrastEnhancement()340 QgsContrastEnhancement *QgsRgbPointCloud3DSymbol::redContrastEnhancement()
341 {
342   return mRedContrastEnhancement.get();
343 }
344 
setRedContrastEnhancement(QgsContrastEnhancement * enhancement)345 void QgsRgbPointCloud3DSymbol::setRedContrastEnhancement( QgsContrastEnhancement *enhancement )
346 {
347   mRedContrastEnhancement.reset( enhancement );
348 }
349 
greenContrastEnhancement()350 QgsContrastEnhancement *QgsRgbPointCloud3DSymbol::greenContrastEnhancement()
351 {
352   return mGreenContrastEnhancement.get();
353 }
354 
setGreenContrastEnhancement(QgsContrastEnhancement * enhancement)355 void QgsRgbPointCloud3DSymbol::setGreenContrastEnhancement( QgsContrastEnhancement *enhancement )
356 {
357   mGreenContrastEnhancement.reset( enhancement );
358 }
359 
blueContrastEnhancement()360 QgsContrastEnhancement *QgsRgbPointCloud3DSymbol::blueContrastEnhancement()
361 {
362   return mBlueContrastEnhancement.get();
363 }
364 
setBlueContrastEnhancement(QgsContrastEnhancement * enhancement)365 void QgsRgbPointCloud3DSymbol::setBlueContrastEnhancement( QgsContrastEnhancement *enhancement )
366 {
367   mBlueContrastEnhancement.reset( enhancement );
368 }
369 
370 // QgsClassificationPointCloud3DSymbol
371 
372 
QgsClassificationPointCloud3DSymbol()373 QgsClassificationPointCloud3DSymbol::QgsClassificationPointCloud3DSymbol()
374   : QgsPointCloud3DSymbol()
375 {
376 
377 }
378 
clone() const379 QgsAbstract3DSymbol *QgsClassificationPointCloud3DSymbol::clone() const
380 {
381   QgsClassificationPointCloud3DSymbol *result = new QgsClassificationPointCloud3DSymbol;
382   result->mPointSize = mPointSize;
383   result->mRenderingParameter = mRenderingParameter;
384   result->mCategoriesList = mCategoriesList;
385   copyBaseSettings( result );
386   return result;
387 }
388 
symbolType() const389 QString QgsClassificationPointCloud3DSymbol::symbolType() const
390 {
391   return QStringLiteral( "classification" );
392 }
393 
writeXml(QDomElement & elem,const QgsReadWriteContext & context) const394 void QgsClassificationPointCloud3DSymbol::writeXml( QDomElement &elem, const QgsReadWriteContext &context ) const
395 {
396   Q_UNUSED( context )
397   QDomDocument doc = elem.ownerDocument();
398 
399   elem.setAttribute( QStringLiteral( "point-size" ), mPointSize );
400   elem.setAttribute( QStringLiteral( "rendering-parameter" ), mRenderingParameter );
401 
402   // categories
403   QDomElement catsElem = doc.createElement( QStringLiteral( "categories" ) );
404   for ( const QgsPointCloudCategory &category : mCategoriesList )
405   {
406     QDomElement catElem = doc.createElement( QStringLiteral( "category" ) );
407     catElem.setAttribute( QStringLiteral( "value" ), QString::number( category.value() ) );
408     catElem.setAttribute( QStringLiteral( "label" ), category.label() );
409     catElem.setAttribute( QStringLiteral( "color" ), QgsSymbolLayerUtils::encodeColor( category.color() ) );
410     catElem.setAttribute( QStringLiteral( "render" ), category.renderState() ? "true" : "false" );
411     catsElem.appendChild( catElem );
412   }
413   elem.appendChild( catsElem );
414 }
415 
readXml(const QDomElement & elem,const QgsReadWriteContext & context)416 void QgsClassificationPointCloud3DSymbol::readXml( const QDomElement &elem, const QgsReadWriteContext &context )
417 {
418   Q_UNUSED( context )
419 
420   mPointSize = elem.attribute( "point-size", QStringLiteral( "2.0" ) ).toFloat();
421   mRenderingParameter = elem.attribute( "rendering-parameter", QString() );
422 
423   const QDomElement catsElem = elem.firstChildElement( QStringLiteral( "categories" ) );
424   if ( !catsElem.isNull() )
425   {
426     mCategoriesList.clear();
427     QDomElement catElem = catsElem.firstChildElement();
428     while ( !catElem.isNull() )
429     {
430       if ( catElem.tagName() == QLatin1String( "category" ) )
431       {
432         const int value = catElem.attribute( QStringLiteral( "value" ) ).toInt();
433         const QString label = catElem.attribute( QStringLiteral( "label" ) );
434         const bool render = catElem.attribute( QStringLiteral( "render" ) ) != QLatin1String( "false" );
435         const QColor color = QgsSymbolLayerUtils::decodeColor( catElem.attribute( QStringLiteral( "color" ) ) );
436         mCategoriesList.append( QgsPointCloudCategory( value, color, label, render ) );
437       }
438       catElem = catElem.nextSiblingElement();
439     }
440   }
441 }
442 
attribute() const443 QString QgsClassificationPointCloud3DSymbol::attribute() const
444 {
445   return mRenderingParameter;
446 }
447 
setAttribute(const QString & attribute)448 void QgsClassificationPointCloud3DSymbol::setAttribute( const QString &attribute )
449 {
450   mRenderingParameter = attribute;
451 }
452 
setCategoriesList(const QgsPointCloudCategoryList & categories)453 void QgsClassificationPointCloud3DSymbol::setCategoriesList( const QgsPointCloudCategoryList &categories )
454 {
455   mCategoriesList = categories;
456 }
457 
getFilteredOutCategories() const458 QgsPointCloudCategoryList QgsClassificationPointCloud3DSymbol::getFilteredOutCategories() const
459 {
460   QgsPointCloudCategoryList filteredOut;
461   for ( const QgsPointCloudCategory &category : mCategoriesList )
462   {
463     if ( !category.renderState() )
464       filteredOut.push_back( category );
465   }
466   return filteredOut;
467 }
468 
colorRampShader() const469 QgsColorRampShader QgsClassificationPointCloud3DSymbol::colorRampShader() const
470 {
471   QgsColorRampShader colorRampShader;
472   colorRampShader.setColorRampType( QgsColorRampShader::Type::Exact );
473   colorRampShader.setClassificationMode( QgsColorRampShader::ClassificationMode::Continuous );
474   QList<QgsColorRampShader::ColorRampItem> colorRampItemList;
475   for ( const QgsPointCloudCategory &category : mCategoriesList )
476   {
477     const QColor color = category.color();
478     const QgsColorRampShader::ColorRampItem item( category.value(), color, category.label() );
479     colorRampItemList.push_back( item );
480   }
481   colorRampShader.setColorRampItemList( colorRampItemList );
482   return colorRampShader;
483 }
484 
485 
fillMaterial(Qt3DRender::QMaterial * mat)486 void QgsClassificationPointCloud3DSymbol::fillMaterial( Qt3DRender::QMaterial *mat )
487 {
488   const QgsColorRampShader mColorRampShader = colorRampShader();
489   Qt3DRender::QParameter *renderingStyle = new Qt3DRender::QParameter( "u_renderingStyle", QgsPointCloud3DSymbol::ColorRamp );
490   mat->addParameter( renderingStyle );
491   Qt3DRender::QParameter *pointSizeParameter = new Qt3DRender::QParameter( "u_pointSize", QVariant::fromValue( mPointSize ) );
492   mat->addParameter( pointSizeParameter );
493   // Create the texture to pass the color ramp
494   Qt3DRender::QTexture1D *colorRampTexture = nullptr;
495   if ( mColorRampShader.colorRampItemList().count() > 0 )
496   {
497     colorRampTexture = new Qt3DRender::QTexture1D( mat );
498     colorRampTexture->addTextureImage( new QgsColorRampTexture( mColorRampShader, 1 ) );
499     colorRampTexture->setMinificationFilter( Qt3DRender::QTexture1D::Linear );
500     colorRampTexture->setMagnificationFilter( Qt3DRender::QTexture1D::Linear );
501   }
502 
503   // Parameters
504   Qt3DRender::QParameter *colorRampTextureParameter = new Qt3DRender::QParameter( "u_colorRampTexture", colorRampTexture );
505   mat->addParameter( colorRampTextureParameter );
506   Qt3DRender::QParameter *colorRampCountParameter = new Qt3DRender::QParameter( "u_colorRampCount", mColorRampShader.colorRampItemList().count() );
507   mat->addParameter( colorRampCountParameter );
508   const int colorRampType = mColorRampShader.colorRampType();
509   Qt3DRender::QParameter *colorRampTypeParameter = new Qt3DRender::QParameter( "u_colorRampType", colorRampType );
510   mat->addParameter( colorRampTypeParameter );
511 }
512 
513