Skip to content

Commit

Permalink
#5567: Update existing material stages when changing the basic controls
Browse files Browse the repository at this point in the history
  • Loading branch information
codereader committed Apr 2, 2021
1 parent affe5a2 commit bc0f15c
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 10 deletions.
60 changes: 51 additions & 9 deletions radiant/ui/materials/editor/MaterialEditor.cpp
Expand Up @@ -293,13 +293,54 @@ 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<MapExpressionEntry>(entryName)->GetTextCtrl();
stage->setMapExpressionFromString(textCtrl->GetValue().ToStdString());

updateStageControls();
onMaterialChanged();
}

void MaterialEditor::setupBasicMaterialPage()
{
convertTextCtrlToMapExpressionEntry("BasicEditorImageEntry");
convertTextCtrlToMapExpressionEntry("BasicDiffuseImageEntry");
convertTextCtrlToMapExpressionEntry("BasicBumpImageEntry");
convertTextCtrlToMapExpressionEntry("BasicSpecularImageEntry");

auto editorImageEntry = getControl<MapExpressionEntry>("BasicEditorImageEntry")->GetTextCtrl();
editorImageEntry->Bind(wxEVT_TEXT, [this, editorImageEntry](wxCommandEvent&)
{
if (!_material || _materialUpdateInProgress) return;

_material->setEditorImageExpressionFromString(editorImageEntry->GetValue().ToStdString());
updateStageBlendControls();
onMaterialChanged();
});

auto diffuseMapEntry = getControl<MapExpressionEntry>("BasicDiffuseImageEntry")->GetTextCtrl();
diffuseMapEntry->Bind(wxEVT_TEXT, [this](wxCommandEvent&) { _onBasicMapEntryChanged("BasicDiffuseImageEntry", IShaderLayer::DIFFUSE); });
auto bumpMapEntry = getControl<MapExpressionEntry>("BasicBumpImageEntry")->GetTextCtrl();
bumpMapEntry->Bind(wxEVT_TEXT, [this](wxCommandEvent&) { _onBasicMapEntryChanged("BasicBumpImageEntry", IShaderLayer::BUMP); });
auto specularMapEntry = getControl<MapExpressionEntry>("BasicSpecularImageEntry")->GetTextCtrl();
specularMapEntry->Bind(wxEVT_TEXT, [this](wxCommandEvent&) { _onBasicMapEntryChanged("BasicSpecularImageEntry", IShaderLayer::SPECULAR); });

auto editorImgTabImage = getControl<wxStaticBitmap>("BasicEditorImageTabImage");
replaceControl(editorImgTabImage, new TexturePreview(editorImgTabImage->GetParent(), TexturePreview::ImageType::EditorImage));

Expand Down Expand Up @@ -1436,19 +1477,20 @@ void MaterialEditor::updateMaterialControlSensitivity()
getControl<wxButton>("MaterialEditorUnlockButton")->Enable(_material && !canBeModified);
}

IShaderLayer::Ptr MaterialEditor::findMaterialStageByType(IShaderLayer::Type type)
std::pair<IShaderLayer::Ptr, std::size_t> MaterialEditor::findMaterialStageByType(IShaderLayer::Type type)
{
if (!_material) return IShaderLayer::Ptr();
if (!_material) return std::pair<IShaderLayer::Ptr, std::size_t>();

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<IShaderLayer::Ptr, std::size_t>();
}

void MaterialEditor::updateBasicPageFromMaterial()
Expand All @@ -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() : "");
}
Expand Down
3 changes: 2 additions & 1 deletion radiant/ui/materials/editor/MaterialEditor.h
Expand Up @@ -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<IShaderLayer::Ptr, std::size_t> findMaterialStageByType(IShaderLayer::Type type);

void updateBasicPageFromMaterial();
void updateStageControls();
Expand Down Expand Up @@ -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();
Expand Down

0 comments on commit bc0f15c

Please sign in to comment.