From 0c88787566f69a7d2433c8996474e2e5ed1b0bfa Mon Sep 17 00:00:00 2001 From: codereader Date: Fri, 2 Apr 2021 06:40:06 +0200 Subject: [PATCH] #5567: Adding/removing stages in basic mode is working now --- .../ui/materials/editor/MaterialEditor.cpp | 69 +++++++++++++++---- radiant/ui/materials/editor/MaterialEditor.h | 1 + 2 files changed, 55 insertions(+), 15 deletions(-) diff --git a/radiant/ui/materials/editor/MaterialEditor.cpp b/radiant/ui/materials/editor/MaterialEditor.cpp index f30ad56e29..fb13fcfbc3 100644 --- a/radiant/ui/materials/editor/MaterialEditor.cpp +++ b/radiant/ui/materials/editor/MaterialEditor.cpp @@ -300,20 +300,54 @@ void MaterialEditor::_onBasicMapEntryChanged(const std::string& entryName, IShad return; } - auto existingStage = findMaterialStageByType(type); + auto textCtrl = getControl(entryName)->GetTextCtrl(); + + auto newValue = textCtrl->GetValue().ToStdString(); - if (!existingStage.first) + // Clearing the text control is the same as removing the stage + if (newValue.empty()) { - // Create stage? + // Remove the corresponding stage + auto stageToRemove = findMaterialStageByType(type); + + if (stageToRemove.first) + { + _material->removeLayer(stageToRemove.second); + updateStageListFromMaterial(); + onMaterialChanged(); + updateBasicImagePreview(); + } + return; } - auto stage = _material->getEditableLayer(existingStage.second); - - auto textCtrl = getControl(entryName)->GetTextCtrl(); + // Non-empty text, create the stage if necessary + auto existingStage = findMaterialStageByType(type); + IEditableShaderLayer::Ptr stage; + bool stageCreated = false; + + if (existingStage.first) + { + stage = _material->getEditableLayer(existingStage.second); + } + + if (!stage) + { + auto index = _material->addLayer(type); + + stage = _material->getEditableLayer(index); + stageCreated = true; + } + stage->setMapExpressionFromString(textCtrl->GetValue().ToStdString()); + if (stageCreated) + { + updateStageListFromMaterial(); + } + updateStageControls(); + updateBasicImagePreview(); onMaterialChanged(); } @@ -1545,15 +1579,7 @@ void MaterialEditor::updateBasicPageFromMaterial() materialTypeDropdown->Select(materialTypeDropdown->FindString(surfType)); } - auto editorImgTabImage = getControl("BasicEditorImageTabImage"); - auto diffuseTabImage = getControl("BasicDiffuseTabImage"); - auto bumpTabImage = getControl("BasicBumpTabImage"); - auto specularTabImage = getControl("BasicSpecularTabImage"); - - editorImgTabImage->SetMaterial(_material); - diffuseTabImage->SetMaterial(_material); - bumpTabImage->SetMaterial(_material); - specularTabImage->SetMaterial(_material); + updateBasicImagePreview(); auto editorImageMap = getControl("BasicEditorImageEntry"); auto diffuseImageMap = getControl("BasicDiffuseImageEntry"); @@ -1576,6 +1602,19 @@ void MaterialEditor::updateBasicPageFromMaterial() specularImageMap->SetValue(expression ? expression->getExpressionString() : ""); } +void MaterialEditor::updateBasicImagePreview() +{ + auto editorImgTabImage = getControl("BasicEditorImageTabImage"); + auto diffuseTabImage = getControl("BasicDiffuseTabImage"); + auto bumpTabImage = getControl("BasicBumpTabImage"); + auto specularTabImage = getControl("BasicSpecularTabImage"); + + editorImgTabImage->SetMaterial(_material); + diffuseTabImage->SetMaterial(_material); + bumpTabImage->SetMaterial(_material); + specularTabImage->SetMaterial(_material); +} + void MaterialEditor::updateControlsFromMaterial() { util::ScopedBoolLock lock(_materialUpdateInProgress); diff --git a/radiant/ui/materials/editor/MaterialEditor.h b/radiant/ui/materials/editor/MaterialEditor.h index 2c88148dfd..99c6f38fd5 100644 --- a/radiant/ui/materials/editor/MaterialEditor.h +++ b/radiant/ui/materials/editor/MaterialEditor.h @@ -136,6 +136,7 @@ class MaterialEditor : std::pair findMaterialStageByType(IShaderLayer::Type type); void updateBasicPageFromMaterial(); + void updateBasicImagePreview(); void updateStageControls(); void updateStageBlendControls(); void updateStageTextureControls();