diff options
3 files changed, 40 insertions, 31 deletions
diff --git a/src/Authoring/Client/Code/Core/Doc/DocumentEditor.cpp b/src/Authoring/Client/Code/Core/Doc/DocumentEditor.cpp index 3b23d034..0324aa20 100644 --- a/src/Authoring/Client/Code/Core/Doc/DocumentEditor.cpp +++ b/src/Authoring/Client/Code/Core/Doc/DocumentEditor.cpp @@ -2499,12 +2499,14 @@ public: void copyMaterialProperties(Qt3DSDMInstanceHandle src, Qt3DSDMInstanceHandle dst) override { - const Q3DStudio::CString matType = GetObjectTypeName(src); + const EStudioObjectType matType = m_Bridge.GetObjectType(src); QString materialTypeString; - if (matType == "CustomMaterial") + if (matType == OBJTYPE_CUSTOMMATERIAL) materialTypeString = m_Bridge.GetSourcePath(src); - else + else if (matType == OBJTYPE_MATERIAL) materialTypeString = QStringLiteral("Standard Material"); + else + return; SetMaterialType(dst, materialTypeString); const auto srcSlide = m_SlideSystem.GetApplicableSlide(src); diff --git a/src/Authoring/Qt3DStudio/Palettes/Inspector/InspectorControlModel.cpp b/src/Authoring/Qt3DStudio/Palettes/Inspector/InspectorControlModel.cpp index e3e08467..ee6e09c0 100644 --- a/src/Authoring/Qt3DStudio/Palettes/Inspector/InspectorControlModel.cpp +++ b/src/Authoring/Qt3DStudio/Palettes/Inspector/InspectorControlModel.cpp @@ -128,7 +128,7 @@ CInspectableBase *InspectorControlModel::inspectable() const } qt3dsdm::Qt3DSDMInstanceHandle InspectorControlModel::getReferenceMaterial( - CInspectableBase *inspectable) const + CInspectableBase *inspectable) const { if (inspectable) return getBridge()->getMaterialReference(inspectable->getInstance()); @@ -136,6 +136,23 @@ qt3dsdm::Qt3DSDMInstanceHandle InspectorControlModel::getReferenceMaterial( return 0; } +qt3dsdm::Qt3DSDMInstanceHandle InspectorControlModel::getReferenceMaterialRecursively( + CInspectableBase *inspectable) const +{ + if (inspectable) { + auto bridge = getBridge(); + auto refMaterial = bridge->getMaterialReference(inspectable->getInstance()); + auto type = bridge->GetObjectType(refMaterial); + while (type == OBJTYPE_REFERENCEDMATERIAL) { + refMaterial = bridge->getMaterialReference(refMaterial); + type = bridge->GetObjectType(refMaterial); + } + return refMaterial; + } + + return 0; +} + void InspectorControlModel::notifyPropertyChanged(qt3dsdm::Qt3DSDMInstanceHandle inInstance, qt3dsdm::Qt3DSDMPropertyHandle inProperty) { @@ -279,19 +296,13 @@ void InspectorControlModel::addMaterial() doc->SelectDataModelObject(newMaterial); const auto type = getBridge()->GetObjectType(instance); - if (type == OBJTYPE_REFERENCEDMATERIAL) { - sceneEditor->setMaterialReferenceByPath(instance, absPath); - sceneEditor->SetName(instance, getBridge()->GetName(newMaterial, true)); - sceneEditor->setMaterialSourcePath(instance, Q3DStudio::CString::fromQString(relPath)); - doc->GetStudioSystem()->GetFullSystemSignalSender()->SendInstancePropertyValue( - instance, getBridge()->GetNameProperty()); - } else { - sceneEditor->SetName(instance, getBridge()->GetName(newMaterial, true)); - sceneEditor->SetMaterialType(instance, QStringLiteral("Standard Material")); - sceneEditor->setMaterialSourcePath(instance, Q3DStudio::CString::fromQString(relPath)); - doc->GetStudioSystem()->GetFullSystemSignalSender()->SendInstancePropertyValue( - instance, getBridge()->GetNameProperty()); - } + if (type != OBJTYPE_REFERENCEDMATERIAL) + sceneEditor->SetMaterialType(instance, QStringLiteral("Referenced Material")); + sceneEditor->setMaterialReferenceByPath(instance, absPath); + sceneEditor->SetName(instance, getBridge()->GetName(newMaterial, true)); + sceneEditor->setMaterialSourcePath(instance, Q3DStudio::CString::fromQString(relPath)); + doc->GetStudioSystem()->GetFullSystemSignalSender()->SendInstancePropertyValue( + instance, getBridge()->GetNameProperty()); } void InspectorControlModel::duplicateMaterial() @@ -308,7 +319,7 @@ void InspectorControlModel::duplicateMaterial() auto material = instance; if (type == OBJTYPE_REFERENCEDMATERIAL) - material = getReferenceMaterial(m_inspectableBase); + material = getReferenceMaterialRecursively(m_inspectableBase); if (material.Valid()) { const auto sceneEditor = doc->getSceneEditor(); @@ -347,19 +358,13 @@ void InspectorControlModel::duplicateMaterial() Q3DStudio::SCOPED_DOCUMENT_EDITOR(*doc, tr("Set Material Type"))); doc->SelectDataModelObject(duplicate); - if (type == OBJTYPE_REFERENCEDMATERIAL) { - scopedEditor->setMaterialReferenceByPath(instance, absPath); - scopedEditor->setMaterialSourcePath(instance, Q3DStudio::CString::fromQString(relPath)); - scopedEditor->SetName(instance, getBridge()->GetName(duplicate, true)); - doc->GetStudioSystem()->GetFullSystemSignalSender()->SendInstancePropertyValue( - instance, getBridge()->GetNameProperty()); - } else if (type != OBJTYPE_CUSTOMMATERIAL) { - sceneEditor->SetName(instance, getBridge()->GetName(duplicate, true)); - sceneEditor->SetMaterialType(instance, QStringLiteral("Standard Material")); - sceneEditor->setMaterialSourcePath(instance, Q3DStudio::CString::fromQString(relPath)); - doc->GetStudioSystem()->GetFullSystemSignalSender()->SendInstancePropertyValue( - instance, getBridge()->GetNameProperty()); - } + if (type != OBJTYPE_REFERENCEDMATERIAL) + sceneEditor->SetMaterialType(instance, QStringLiteral("Referenced Material")); + scopedEditor->setMaterialReferenceByPath(instance, absPath); + scopedEditor->setMaterialSourcePath(instance, Q3DStudio::CString::fromQString(relPath)); + scopedEditor->SetName(instance, getBridge()->GetName(duplicate, true)); + doc->GetStudioSystem()->GetFullSystemSignalSender()->SendInstancePropertyValue( + instance, getBridge()->GetNameProperty()); } } diff --git a/src/Authoring/Qt3DStudio/Palettes/Inspector/InspectorControlModel.h b/src/Authoring/Qt3DStudio/Palettes/Inspector/InspectorControlModel.h index b1c13240..79e6613a 100644 --- a/src/Authoring/Qt3DStudio/Palettes/Inspector/InspectorControlModel.h +++ b/src/Authoring/Qt3DStudio/Palettes/Inspector/InspectorControlModel.h @@ -204,6 +204,8 @@ private: void updateMaterialValues(const QStringList &values, int elementIndex, bool updatingShaders = false); qt3dsdm::Qt3DSDMInstanceHandle getReferenceMaterial(CInspectableBase *inspectable) const; + qt3dsdm::Qt3DSDMInstanceHandle getReferenceMaterialRecursively( + CInspectableBase *inspectable) const; void updateShaderValues(); void updateMatDataValues(); void updatePropertyValue(InspectorControlBase *element) const; |