diff --git a/radiant/ui/materials/editor/MaterialEditor.cpp b/radiant/ui/materials/editor/MaterialEditor.cpp index fd3f7f5b56..f4e872a3a1 100644 --- a/radiant/ui/materials/editor/MaterialEditor.cpp +++ b/radiant/ui/materials/editor/MaterialEditor.cpp @@ -293,6 +293,30 @@ void MaterialEditor::setupMaterialTreeView() unlockButton->Bind(wxEVT_BUTTON, &MaterialEditor::_onUnlockMaterial, this); } +void MaterialEditor::_onBasicMapEntryChanged(const std::string& entryName, IShaderLayer::Type type) +{ + if (!_material || _materialUpdateInProgress) + { + return; + } + + auto existingStage = findMaterialStageByType(type); + + if (!existingStage.first) + { + // Create stage? + return; + } + + auto stage = _material->getEditableLayer(existingStage.second); + + auto textCtrl = getControl(entryName)->GetTextCtrl(); + stage->setMapExpressionFromString(textCtrl->GetValue().ToStdString()); + + updateStageControls(); + onMaterialChanged(); +} + void MaterialEditor::setupBasicMaterialPage() { convertTextCtrlToMapExpressionEntry("BasicEditorImageEntry"); @@ -300,6 +324,23 @@ void MaterialEditor::setupBasicMaterialPage() convertTextCtrlToMapExpressionEntry("BasicBumpImageEntry"); convertTextCtrlToMapExpressionEntry("BasicSpecularImageEntry"); + auto editorImageEntry = getControl("BasicEditorImageEntry")->GetTextCtrl(); + editorImageEntry->Bind(wxEVT_TEXT, [this, editorImageEntry](wxCommandEvent&) + { + if (!_material || _materialUpdateInProgress) return; + + _material->setEditorImageExpressionFromString(editorImageEntry->GetValue().ToStdString()); + updateStageBlendControls(); + onMaterialChanged(); + }); + + auto diffuseMapEntry = getControl("BasicDiffuseImageEntry")->GetTextCtrl(); + diffuseMapEntry->Bind(wxEVT_TEXT, [this](wxCommandEvent&) { _onBasicMapEntryChanged("BasicDiffuseImageEntry", IShaderLayer::DIFFUSE); }); + auto bumpMapEntry = getControl("BasicBumpImageEntry")->GetTextCtrl(); + bumpMapEntry->Bind(wxEVT_TEXT, [this](wxCommandEvent&) { _onBasicMapEntryChanged("BasicBumpImageEntry", IShaderLayer::BUMP); }); + auto specularMapEntry = getControl("BasicSpecularImageEntry")->GetTextCtrl(); + specularMapEntry->Bind(wxEVT_TEXT, [this](wxCommandEvent&) { _onBasicMapEntryChanged("BasicSpecularImageEntry", IShaderLayer::SPECULAR); }); + auto editorImgTabImage = getControl("BasicEditorImageTabImage"); replaceControl(editorImgTabImage, new TexturePreview(editorImgTabImage->GetParent(), TexturePreview::ImageType::EditorImage)); @@ -1436,19 +1477,20 @@ void MaterialEditor::updateMaterialControlSensitivity() getControl("MaterialEditorUnlockButton")->Enable(_material && !canBeModified); } -IShaderLayer::Ptr MaterialEditor::findMaterialStageByType(IShaderLayer::Type type) +std::pair MaterialEditor::findMaterialStageByType(IShaderLayer::Type type) { - if (!_material) return IShaderLayer::Ptr(); + if (!_material) return std::pair(); - for (const auto& layer : _material->getAllLayers()) + const auto& layers = _material->getAllLayers(); + for (auto i = 0; i < layers.size(); ++i) { - if (layer->getType() == type) + if (layers[i]->getType() == type) { - return layer; + return std::make_pair(layers[i], i); } } - return IShaderLayer::Ptr(); + return std::pair(); } void MaterialEditor::updateBasicPageFromMaterial() @@ -1471,15 +1513,15 @@ void MaterialEditor::updateBasicPageFromMaterial() auto editorImg = _material ? _material->getEditorImageExpression() : shaders::IMapExpression::Ptr(); editorImageMap->SetValue(editorImg ? editorImg->getExpressionString() : ""); - auto diffuse = findMaterialStageByType(IShaderLayer::DIFFUSE); + auto diffuse = findMaterialStageByType(IShaderLayer::DIFFUSE).first; auto expression = diffuse ? diffuse->getMapExpression() : shaders::IMapExpression::Ptr(); diffuseImageMap->SetValue(expression ? expression->getExpressionString() : ""); - auto bump = findMaterialStageByType(IShaderLayer::BUMP); + auto bump = findMaterialStageByType(IShaderLayer::BUMP).first; expression = bump ? bump->getMapExpression() : shaders::IMapExpression::Ptr(); bumpImageMap->SetValue(expression ? expression->getExpressionString() : ""); - auto specular = findMaterialStageByType(IShaderLayer::SPECULAR); + auto specular = findMaterialStageByType(IShaderLayer::SPECULAR).first; expression = specular ? specular->getMapExpression() : shaders::IMapExpression::Ptr(); specularImageMap->SetValue(expression ? expression->getExpressionString() : ""); } diff --git a/radiant/ui/materials/editor/MaterialEditor.h b/radiant/ui/materials/editor/MaterialEditor.h index 031870dcbb..bbb6e33899 100644 --- a/radiant/ui/materials/editor/MaterialEditor.h +++ b/radiant/ui/materials/editor/MaterialEditor.h @@ -133,7 +133,7 @@ class MaterialEditor : void selectMaterial(const MaterialPtr& material); IShaderLayer::Ptr getSelectedStage(); IEditableShaderLayer::Ptr getEditableStageForSelection(); - IShaderLayer::Ptr findMaterialStageByType(IShaderLayer::Type type); + std::pair findMaterialStageByType(IShaderLayer::Type type); void updateBasicPageFromMaterial(); void updateStageControls(); @@ -178,6 +178,7 @@ class MaterialEditor : void _onToggleStage(wxCommandEvent& ev); void _onDuplicateStage(wxCommandEvent& ev); void _onSortRequestChanged(wxCommandEvent& ev); + void _onBasicMapEntryChanged(const std::string& entryName, IShaderLayer::Type type); void toggleSelectedStage(); void onMaterialChanged();