Skip to content

Commit

Permalink
#5532: Better colored interaction with the RGBA expressions
Browse files Browse the repository at this point in the history
  • Loading branch information
codereader committed Mar 19, 2021
1 parent b41cf10 commit 8350d27
Show file tree
Hide file tree
Showing 3 changed files with 63 additions and 5 deletions.
54 changes: 49 additions & 5 deletions radiant/ui/materials/MaterialEditor.cpp
Expand Up @@ -520,6 +520,8 @@ void MaterialEditor::setupMaterialStageProperties()
_stageBindings.emplace(std::make_shared<CheckBoxBinding<IShaderLayer::Ptr>>(getControl<wxCheckBox>("MaterialStageColored"),
[](const IShaderLayer::Ptr& layer) { return stageQualifiesAsColoured(layer); }));

getControl<wxCheckBox>("MaterialStageColored")->Bind(wxEVT_CHECKBOX, &MaterialEditor::_onStageColoredChecked, this);

createRadioButtonBinding("MaterialStageNoVertexColourFlag",
[](const IShaderLayer::Ptr& layer) { return layer->getVertexColourMode() == IShaderLayer::VERTEX_COLOUR_NONE; },
[](const IEditableShaderLayer::Ptr& layer, bool value) { if (value) layer->setVertexColourMode(IShaderLayer::VERTEX_COLOUR_NONE); });
Expand All @@ -535,28 +537,28 @@ void MaterialEditor::setupMaterialStageProperties()
[this](const IEditableShaderLayer::Ptr& layer, const std::string& value)
{
layer->setColourExpressionFromString(IShaderLayer::COMP_RED, value);
getControl<wxCheckBox>("MaterialStageColored")->SetValue(stageQualifiesAsColoured(layer));
updateStageColoredStatus();
});
createExpressionBinding("MaterialStageGreen",
[](const IShaderLayer::Ptr& layer) { return layer->getColourExpression(IShaderLayer::COMP_GREEN); },
[this](const IEditableShaderLayer::Ptr& layer, const std::string& value)
{
layer->setColourExpressionFromString(IShaderLayer::COMP_GREEN, value);
getControl<wxCheckBox>("MaterialStageColored")->SetValue(stageQualifiesAsColoured(layer));
updateStageColoredStatus();
});
createExpressionBinding("MaterialStageBlue",
[](const IShaderLayer::Ptr& layer) { return layer->getColourExpression(IShaderLayer::COMP_BLUE); },
[this](const IEditableShaderLayer::Ptr& layer, const std::string& value)
{
layer->setColourExpressionFromString(IShaderLayer::COMP_BLUE, value);
getControl<wxCheckBox>("MaterialStageColored")->SetValue(stageQualifiesAsColoured(layer));
updateStageColoredStatus();
});
createExpressionBinding("MaterialStageAlpha",
[](const IShaderLayer::Ptr& layer) { return layer->getColourExpression(IShaderLayer::COMP_ALPHA); },
[this](const IEditableShaderLayer::Ptr& layer, const std::string& value)
{
layer->setColourExpressionFromString(IShaderLayer::COMP_ALPHA, value);
getControl<wxCheckBox>("MaterialStageColored")->SetValue(stageQualifiesAsColoured(layer));
layer->setColourExpressionFromString(IShaderLayer::COMP_ALPHA, value);
updateStageColoredStatus();
});

auto parameterPanel = getControl<wxPanel>("MaterialStageProgramParameters");
Expand All @@ -573,6 +575,22 @@ void MaterialEditor::setupMaterialStageProperties()
parameterPanel->GetSizer()->Add(paramsView, 1, wxEXPAND);
}

void MaterialEditor::updateStageColoredStatus()
{
auto selectedStage = getSelectedStage();

if (!selectedStage) return;

bool stageIsColoured = stageQualifiesAsColoured(selectedStage);

getControl<wxCheckBox>("MaterialStageColored")->SetValue(stageIsColoured);

getControl<wxTextCtrl>("MaterialStageRed")->Enable(!stageIsColoured);
getControl<wxTextCtrl>("MaterialStageGreen")->Enable(!stageIsColoured);
getControl<wxTextCtrl>("MaterialStageBlue")->Enable(!stageIsColoured);
getControl<wxTextCtrl>("MaterialStageAlpha")->Enable(!stageIsColoured);
}

void MaterialEditor::_onTreeViewSelectionChanged(wxDataViewEvent& ev)
{
// Update the preview if a texture is selected
Expand Down Expand Up @@ -1122,6 +1140,7 @@ void MaterialEditor::updateStageControls()
updateStageTexgenControls();
updateStageProgramControls();
updateStageTransformControls();
updateStageColoredStatus();

if (selectedStage)
{
Expand Down Expand Up @@ -1314,6 +1333,31 @@ void MaterialEditor::_onStageTransformEdited(wxDataViewEvent& ev)
stage->updateTransformation(transformIndex, type, expression1, expression2);
}

void MaterialEditor::_onStageColoredChecked(wxCommandEvent& ev)
{
auto selectedStage = getEditableStageForSelection();
if (!selectedStage) return;

bool stageIsCurrentlyColoured = stageQualifiesAsColoured(selectedStage);

if (ev.IsChecked() && !stageIsCurrentlyColoured)
{
selectedStage->setColourExpressionFromString(IShaderLayer::COMP_RED, "parm0");
selectedStage->setColourExpressionFromString(IShaderLayer::COMP_GREEN, "parm1");
selectedStage->setColourExpressionFromString(IShaderLayer::COMP_BLUE, "parm2");
selectedStage->setColourExpressionFromString(IShaderLayer::COMP_ALPHA, "parm3");
}
else if (!ev.IsChecked() && stageIsCurrentlyColoured)
{
selectedStage->setColourExpressionFromString(IShaderLayer::COMP_RED, "");
selectedStage->setColourExpressionFromString(IShaderLayer::COMP_GREEN, "");
selectedStage->setColourExpressionFromString(IShaderLayer::COMP_BLUE, "");
selectedStage->setColourExpressionFromString(IShaderLayer::COMP_ALPHA, "");
}

updateStageControls();
}

void MaterialEditor::onMaterialChanged()
{
_preview->onMaterialChanged();
Expand Down
2 changes: 2 additions & 0 deletions radiant/ui/materials/MaterialEditor.h
Expand Up @@ -121,13 +121,15 @@ class MaterialEditor :
void updateStageTexgenControls();
void updateStageProgramControls();
void updateStageTransformControls();
void updateStageColoredStatus();

void _onTreeViewSelectionChanged(wxDataViewEvent& ev);
void _onStageListSelectionChanged(wxDataViewEvent& ev);
void _onMaterialTypeChoice(wxCommandEvent& ev);
void _onAddStageTransform(wxCommandEvent& ev);
void _onRemoveStageTransform(wxCommandEvent& ev);
void _onStageTransformEdited(wxDataViewEvent& ev);
void _onStageColoredChecked(wxCommandEvent& ev);

void onMaterialChanged();

Expand Down
12 changes: 12 additions & 0 deletions radiantcore/shaders/Doom3ShaderLayer.cpp
Expand Up @@ -559,6 +559,12 @@ void Doom3ShaderLayer::updateTransformation(std::size_t index, TransformType typ

void Doom3ShaderLayer::setColourExpressionFromString(ColourComponentSelector component, const std::string& expression)
{
if (expression.empty())
{
setColourExpression(component, IShaderExpression::Ptr());
return;
}

auto expr = ShaderExpression::createFromString(expression);

if (expr)
Expand All @@ -569,6 +575,12 @@ void Doom3ShaderLayer::setColourExpressionFromString(ColourComponentSelector com

void Doom3ShaderLayer::setConditionExpressionFromString(const std::string& expression)
{
if (expression.empty())
{
setCondition(IShaderExpression::Ptr());
return;
}

auto expr = ShaderExpression::createFromString(expression);

if (expr)
Expand Down

0 comments on commit 8350d27

Please sign in to comment.