diff --git a/src/3d/symbols/qgspoint3dsymbol_p.cpp b/src/3d/symbols/qgspoint3dsymbol_p.cpp index 6e44e3a52b66..54722f277a6c 100644 --- a/src/3d/symbols/qgspoint3dsymbol_p.cpp +++ b/src/3d/symbols/qgspoint3dsymbol_p.cpp @@ -413,7 +413,9 @@ void QgsModelPoint3DSymbolHandler::makeEntity( Qt3DCore::QEntity *parent, const } else { - if ( mSymbol->shapeProperties()[QStringLiteral( "overwriteMaterial" )].toBool() ) + // "overwriteMaterial" is a legacy setting indicating that non-embedded material should be used + if ( mSymbol->shapeProperties()[QStringLiteral( "overwriteMaterial" )].toBool() + || ( mSymbol->material() && mSymbol->material()->type() != QLatin1String( "null" ) ) ) { addMeshEntities( context.map(), out.positions, mSymbol.get(), parent, false ); } diff --git a/src/app/3d/qgsmaterialwidget.cpp b/src/app/3d/qgsmaterialwidget.cpp index 50a1fb4c71fe..7abada08c53a 100644 --- a/src/app/3d/qgsmaterialwidget.cpp +++ b/src/app/3d/qgsmaterialwidget.cpp @@ -88,6 +88,12 @@ QgsAbstractMaterialSettings *QgsMaterialWidget::settings() return mCurrentSettings->clone(); } +void QgsMaterialWidget::setType( const QString &type ) +{ + mMaterialTypeComboBox->setCurrentIndex( mMaterialTypeComboBox->findData( type ) ); + materialTypeChanged(); +} + void QgsMaterialWidget::materialTypeChanged() { std::unique_ptr< QgsAbstractMaterialSettings > currentSettings( settings() ); diff --git a/src/app/3d/qgsmaterialwidget.h b/src/app/3d/qgsmaterialwidget.h index f6b04dff6107..02b13352c47f 100644 --- a/src/app/3d/qgsmaterialwidget.h +++ b/src/app/3d/qgsmaterialwidget.h @@ -41,6 +41,8 @@ class QgsMaterialWidget : public QWidget, private Ui::MaterialWidgetBase void setSettings( const QgsAbstractMaterialSettings *settings, QgsVectorLayer *layer ); QgsAbstractMaterialSettings *settings(); + void setType( const QString &type ); + signals: void changed(); diff --git a/src/app/3d/qgspoint3dsymbolwidget.cpp b/src/app/3d/qgspoint3dsymbolwidget.cpp index 78d76b90f009..15de874617c7 100644 --- a/src/app/3d/qgspoint3dsymbolwidget.cpp +++ b/src/app/3d/qgspoint3dsymbolwidget.cpp @@ -74,15 +74,12 @@ QgsPoint3DSymbolWidget::QgsPoint3DSymbolWidget( QWidget *parent ) for ( QDoubleSpinBox *spinBox : constSpinWidgets ) connect( spinBox, static_cast( &QDoubleSpinBox::valueChanged ), this, &QgsPoint3DSymbolWidget::changed ); connect( lineEditModel, &QgsAbstractFileContentSourceLineEdit::sourceChanged, this, &QgsPoint3DSymbolWidget::changed ); - connect( cbOverwriteMaterial, static_cast( &QCheckBox::stateChanged ), this, &QgsPoint3DSymbolWidget::onOverwriteMaterialChecked ); connect( widgetMaterial, &QgsMaterialWidget::changed, this, &QgsPoint3DSymbolWidget::changed ); connect( btnChangeSymbol, static_cast( &QgsSymbolButton::changed ), this, &QgsPoint3DSymbolWidget::changed ); // Sync between billboard height and TY connect( spinBillboardHeight, static_cast( &QDoubleSpinBox::valueChanged ), spinTY, &QDoubleSpinBox::setValue ); connect( spinTY, static_cast( &QDoubleSpinBox::valueChanged ), spinBillboardHeight, &QDoubleSpinBox::setValue ); - - widgetMaterial->setTechnique( QgsMaterialSettingsRenderingTechnique::InstancedPoints ); } Qgs3DSymbolWidget *QgsPoint3DSymbolWidget::create( QgsVectorLayer * ) @@ -90,19 +87,6 @@ Qgs3DSymbolWidget *QgsPoint3DSymbolWidget::create( QgsVectorLayer * ) return new QgsPoint3DSymbolWidget(); } -void QgsPoint3DSymbolWidget::onOverwriteMaterialChecked( int state ) -{ - if ( state == Qt::Checked ) - { - widgetMaterial->setEnabled( true ); - } - else - { - widgetMaterial->setEnabled( false ); - } - emit changed(); -} - void QgsPoint3DSymbolWidget::setSymbol( const QgsAbstract3DSymbol *symbol, QgsVectorLayer *layer ) { const QgsPoint3DSymbol *pointSymbol = dynamic_cast< const QgsPoint3DSymbol *>( symbol ); @@ -114,8 +98,8 @@ void QgsPoint3DSymbolWidget::setSymbol( const QgsAbstract3DSymbol *symbol, QgsVe QVariantMap vm = pointSymbol->shapeProperties(); int index = cboShape->findData( pointSymbol->shape() ); cboShape->setCurrentIndex( index != -1 ? index : 1 ); // use cylinder by default if shape is not set - widgetMaterial->setEnabled( true ); QgsMaterialSettingsRenderingTechnique technique = QgsMaterialSettingsRenderingTechnique::InstancedPoints; + bool forceNullMaterial = false; switch ( cboShape->currentIndex() ) { case 0: // sphere @@ -143,9 +127,11 @@ void QgsPoint3DSymbolWidget::setSymbol( const QgsAbstract3DSymbol *symbol, QgsVe case 6: // 3d model { lineEditModel->setSource( vm[QStringLiteral( "model" )].toString() ); - bool overwriteMaterial = vm[QStringLiteral( "overwriteMaterial" )].toBool(); - widgetMaterial->setEnabled( overwriteMaterial ); - cbOverwriteMaterial->setChecked( overwriteMaterial ); + // "overwriteMaterial" is a legacy setting indicating that non-null material should be used + forceNullMaterial = ( vm.contains( QStringLiteral( "overwriteMaterial" ) ) && !vm[QStringLiteral( "overwriteMaterial" )].toBool() ) + || !pointSymbol->material() + || pointSymbol->material()->type() == QLatin1String( "null" ); + technique = QgsMaterialSettingsRenderingTechnique::TrianglesFromModel; break; } case 7: // billboard @@ -160,6 +146,11 @@ void QgsPoint3DSymbolWidget::setSymbol( const QgsAbstract3DSymbol *symbol, QgsVe widgetMaterial->setSettings( pointSymbol->material(), layer ); widgetMaterial->setTechnique( technique ); + if ( forceNullMaterial ) + { + widgetMaterial->setType( QStringLiteral( "null" ) ); + } + // decompose the transform matrix // assuming the last row has values [0 0 0 1] // 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() break; case 6: // 3d model vm[QStringLiteral( "model" )] = lineEditModel->source(); - vm[QStringLiteral( "overwriteMaterial" )] = cbOverwriteMaterial->isChecked(); break; case 7: // billboard sym->setBillboardSymbol( btnChangeSymbol->clonedSymbol() ); @@ -258,10 +248,9 @@ void QgsPoint3DSymbolWidget::onShapeChanged() << labelTopRadius << spinTopRadius << labelBottomRadius << spinBottomRadius << labelLength << spinLength - << labelModel << lineEditModel << cbOverwriteMaterial + << labelModel << lineEditModel << labelBillboardHeight << spinBillboardHeight << labelBillboardSymbol << btnChangeSymbol; - widgetMaterial->setEnabled( true ); materialsGroupBox->show(); transformationWidget->show(); QList activeWidgets; @@ -287,8 +276,8 @@ void QgsPoint3DSymbolWidget::onShapeChanged() activeWidgets << labelRadius << spinRadius << labelMinorRadius << spinMinorRadius; break; case 6: // 3d model - activeWidgets << labelModel << lineEditModel << cbOverwriteMaterial; - widgetMaterial->setEnabled( cbOverwriteMaterial->isChecked() ); + activeWidgets << labelModel << lineEditModel; + technique = QgsMaterialSettingsRenderingTechnique::TrianglesFromModel; break; case 7: // billboard activeWidgets << labelBillboardHeight << spinBillboardHeight << labelBillboardSymbol << btnChangeSymbol; @@ -301,6 +290,12 @@ void QgsPoint3DSymbolWidget::onShapeChanged() widgetMaterial->setTechnique( technique ); + if ( cboShape->currentIndex() == 6 ) + { + // going from different shape -> model resets the material to the null type + widgetMaterial->setType( QStringLiteral( "null" ) ); + } + const auto constAllWidgets = allWidgets; for ( QWidget *w : constAllWidgets ) { diff --git a/src/app/3d/qgspoint3dsymbolwidget.h b/src/app/3d/qgspoint3dsymbolwidget.h index 129977d88363..e0e3cc154b4d 100644 --- a/src/app/3d/qgspoint3dsymbolwidget.h +++ b/src/app/3d/qgspoint3dsymbolwidget.h @@ -37,7 +37,6 @@ class QgsPoint3DSymbolWidget : public Qgs3DSymbolWidget, private Ui::Point3DSymb private slots: void onShapeChanged(); - void onOverwriteMaterialChecked( int state ); }; #endif // QGSPOINT3DSYMBOLWIDGET_H diff --git a/src/ui/3d/point3dsymbolwidget.ui b/src/ui/3d/point3dsymbolwidget.ui index 3cd31b980053..06fa75497e75 100644 --- a/src/ui/3d/point3dsymbolwidget.ui +++ b/src/ui/3d/point3dsymbolwidget.ui @@ -14,7 +14,16 @@ Form - + + 0 + + + 0 + + + 0 + + 0 @@ -182,7 +191,16 @@ Shading - + + 0 + + + 0 + + + 0 + + 0 @@ -238,17 +256,7 @@ - - - - - - Overwrite model material - - - - - + @@ -404,6 +412,11 @@ + + QgsDoubleSpinBox + QDoubleSpinBox +
qgsdoublespinbox.h
+
Qgs3DModelSourceLineEdit QWidget @@ -416,11 +429,6 @@
qgsmaterialwidget.h
1
- - QgsDoubleSpinBox - QDoubleSpinBox -
qgsdoublespinbox.h
-
QgsSymbolButton QToolButton @@ -442,7 +450,6 @@ spinSize spinLength lineEditModel - cbOverwriteMaterial spinBillboardHeight btnChangeSymbol cboAltClamping