@@ -74,35 +74,19 @@ QgsPoint3DSymbolWidget::QgsPoint3DSymbolWidget( QWidget *parent )
74
74
for ( QDoubleSpinBox *spinBox : constSpinWidgets )
75
75
connect ( spinBox, static_cast <void ( QDoubleSpinBox::* )( double )>( &QDoubleSpinBox::valueChanged ), this , &QgsPoint3DSymbolWidget::changed );
76
76
connect ( lineEditModel, &QgsAbstractFileContentSourceLineEdit::sourceChanged, this , &QgsPoint3DSymbolWidget::changed );
77
- connect ( cbOverwriteMaterial, static_cast <void ( QCheckBox::* )( int )>( &QCheckBox::stateChanged ), this , &QgsPoint3DSymbolWidget::onOverwriteMaterialChecked );
78
77
connect ( widgetMaterial, &QgsMaterialWidget::changed, this , &QgsPoint3DSymbolWidget::changed );
79
78
connect ( btnChangeSymbol, static_cast <void ( QgsSymbolButton::* )( )>( &QgsSymbolButton::changed ), this , &QgsPoint3DSymbolWidget::changed );
80
79
81
80
// Sync between billboard height and TY
82
81
connect ( spinBillboardHeight, static_cast <void ( QDoubleSpinBox::* )( double )>( &QDoubleSpinBox::valueChanged ), spinTY, &QDoubleSpinBox::setValue );
83
82
connect ( spinTY, static_cast <void ( QDoubleSpinBox::* )( double )>( &QDoubleSpinBox::valueChanged ), spinBillboardHeight, &QDoubleSpinBox::setValue );
84
-
85
- widgetMaterial->setTechnique ( QgsMaterialSettingsRenderingTechnique::InstancedPoints );
86
83
}
87
84
88
85
Qgs3DSymbolWidget *QgsPoint3DSymbolWidget::create ( QgsVectorLayer * )
89
86
{
90
87
return new QgsPoint3DSymbolWidget ();
91
88
}
92
89
93
- void QgsPoint3DSymbolWidget::onOverwriteMaterialChecked ( int state )
94
- {
95
- if ( state == Qt::Checked )
96
- {
97
- widgetMaterial->setEnabled ( true );
98
- }
99
- else
100
- {
101
- widgetMaterial->setEnabled ( false );
102
- }
103
- emit changed ();
104
- }
105
-
106
90
void QgsPoint3DSymbolWidget::setSymbol ( const QgsAbstract3DSymbol *symbol, QgsVectorLayer *layer )
107
91
{
108
92
const QgsPoint3DSymbol *pointSymbol = dynamic_cast < const QgsPoint3DSymbol *>( symbol );
@@ -114,8 +98,8 @@ void QgsPoint3DSymbolWidget::setSymbol( const QgsAbstract3DSymbol *symbol, QgsVe
114
98
QVariantMap vm = pointSymbol->shapeProperties ();
115
99
int index = cboShape->findData ( pointSymbol->shape () );
116
100
cboShape->setCurrentIndex ( index != -1 ? index : 1 ); // use cylinder by default if shape is not set
117
- widgetMaterial->setEnabled ( true );
118
101
QgsMaterialSettingsRenderingTechnique technique = QgsMaterialSettingsRenderingTechnique::InstancedPoints;
102
+ bool forceNullMaterial = false ;
119
103
switch ( cboShape->currentIndex () )
120
104
{
121
105
case 0 : // sphere
@@ -143,9 +127,11 @@ void QgsPoint3DSymbolWidget::setSymbol( const QgsAbstract3DSymbol *symbol, QgsVe
143
127
case 6 : // 3d model
144
128
{
145
129
lineEditModel->setSource ( vm[QStringLiteral ( " model" )].toString () );
146
- bool overwriteMaterial = vm[QStringLiteral ( " overwriteMaterial" )].toBool ();
147
- widgetMaterial->setEnabled ( overwriteMaterial );
148
- cbOverwriteMaterial->setChecked ( overwriteMaterial );
130
+ // "overwriteMaterial" is a legacy setting indicating that non-null material should be used
131
+ forceNullMaterial = ( vm.contains ( QStringLiteral ( " overwriteMaterial" ) ) && !vm[QStringLiteral ( " overwriteMaterial" )].toBool () )
132
+ || !pointSymbol->material ()
133
+ || pointSymbol->material ()->type () == QLatin1String ( " null" );
134
+ technique = QgsMaterialSettingsRenderingTechnique::TrianglesFromModel;
149
135
break ;
150
136
}
151
137
case 7 : // billboard
@@ -160,6 +146,11 @@ void QgsPoint3DSymbolWidget::setSymbol( const QgsAbstract3DSymbol *symbol, QgsVe
160
146
widgetMaterial->setSettings ( pointSymbol->material (), layer );
161
147
widgetMaterial->setTechnique ( technique );
162
148
149
+ if ( forceNullMaterial )
150
+ {
151
+ widgetMaterial->setType ( QStringLiteral ( " null" ) );
152
+ }
153
+
163
154
// decompose the transform matrix
164
155
// assuming the last row has values [0 0 0 1]
165
156
// see https://math.stackexchange.com/questions/237369/given-this-transformation-matrix-how-do-i-decompose-it-into-translation-rotati
@@ -220,7 +211,6 @@ QgsAbstract3DSymbol *QgsPoint3DSymbolWidget::symbol()
220
211
break ;
221
212
case 6 : // 3d model
222
213
vm[QStringLiteral ( " model" )] = lineEditModel->source ();
223
- vm[QStringLiteral ( " overwriteMaterial" )] = cbOverwriteMaterial->isChecked ();
224
214
break ;
225
215
case 7 : // billboard
226
216
sym->setBillboardSymbol ( btnChangeSymbol->clonedSymbol <QgsMarkerSymbol>() );
@@ -258,10 +248,9 @@ void QgsPoint3DSymbolWidget::onShapeChanged()
258
248
<< labelTopRadius << spinTopRadius
259
249
<< labelBottomRadius << spinBottomRadius
260
250
<< labelLength << spinLength
261
- << labelModel << lineEditModel << cbOverwriteMaterial
251
+ << labelModel << lineEditModel
262
252
<< labelBillboardHeight << spinBillboardHeight << labelBillboardSymbol << btnChangeSymbol;
263
253
264
- widgetMaterial->setEnabled ( true );
265
254
materialsGroupBox->show ();
266
255
transformationWidget->show ();
267
256
QList<QWidget *> activeWidgets;
@@ -287,8 +276,8 @@ void QgsPoint3DSymbolWidget::onShapeChanged()
287
276
activeWidgets << labelRadius << spinRadius << labelMinorRadius << spinMinorRadius;
288
277
break ;
289
278
case 6 : // 3d model
290
- activeWidgets << labelModel << lineEditModel << cbOverwriteMaterial ;
291
- widgetMaterial-> setEnabled ( cbOverwriteMaterial-> isChecked () ) ;
279
+ activeWidgets << labelModel << lineEditModel;
280
+ technique = QgsMaterialSettingsRenderingTechnique::TrianglesFromModel ;
292
281
break ;
293
282
case 7 : // billboard
294
283
activeWidgets << labelBillboardHeight << spinBillboardHeight << labelBillboardSymbol << btnChangeSymbol;
@@ -301,6 +290,12 @@ void QgsPoint3DSymbolWidget::onShapeChanged()
301
290
302
291
widgetMaterial->setTechnique ( technique );
303
292
293
+ if ( cboShape->currentIndex () == 6 )
294
+ {
295
+ // going from different shape -> model resets the material to the null type
296
+ widgetMaterial->setType ( QStringLiteral ( " null" ) );
297
+ }
298
+
304
299
const auto constAllWidgets = allWidgets;
305
300
for ( QWidget *w : constAllWidgets )
306
301
{
0 commit comments