From 5919c9b82adf7d256475b2e74f81b8c34a757192 Mon Sep 17 00:00:00 2001 From: codereader Date: Fri, 19 Mar 2021 14:51:54 +0100 Subject: [PATCH] #5532: Bind vertex colour controls --- include/ishaderlayer.h | 3 + radiant/ui/materials/MaterialEditor.cpp | 23 ++++++++ radiant/ui/materials/MaterialEditor.h | 5 +- radiant/ui/materials/RadioButtonBinding.h | 68 +++++++++++++++++++++++ radiantcore/shaders/Doom3ShaderLayer.h | 2 +- tools/msvc/DarkRadiant.vcxproj | 1 + tools/msvc/DarkRadiant.vcxproj.filters | 3 + 7 files changed, 103 insertions(+), 2 deletions(-) create mode 100644 radiant/ui/materials/RadioButtonBinding.h diff --git a/include/ishaderlayer.h b/include/ishaderlayer.h index b7c9153b2b..9469748403 100644 --- a/include/ishaderlayer.h +++ b/include/ishaderlayer.h @@ -424,4 +424,7 @@ class IEditableShaderLayer : // Set the stage condition expression virtual void setConditionExpressionFromString(const std::string& expression) = 0; + + // Set the vertex colour mode of this stage + virtual void setVertexColourMode(VertexColourMode mode) = 0; }; diff --git a/radiant/ui/materials/MaterialEditor.cpp b/radiant/ui/materials/MaterialEditor.cpp index 219f5cd6fb..cef82b48eb 100644 --- a/radiant/ui/materials/MaterialEditor.cpp +++ b/radiant/ui/materials/MaterialEditor.cpp @@ -20,6 +20,7 @@ #include "string/join.h" #include "materials/ParseLib.h" #include "ExpressionBinding.h" +#include "RadioButtonBinding.h" namespace ui { @@ -376,6 +377,18 @@ void MaterialEditor::createExpressionBinding(const std::string& textCtrlName, std::bind(&MaterialEditor::onMaterialChanged, this))); } +void MaterialEditor::createRadioButtonBinding(const std::string& ctrlName, + const std::function& loadFunc, + const std::function& saveFunc) +{ + _stageBindings.emplace(std::make_shared( + getControl(ctrlName), + loadFunc, + std::bind(&MaterialEditor::getEditableStageForSelection, this), + saveFunc, + std::bind(&MaterialEditor::onMaterialChanged, this))); +} + void MaterialEditor::setupMaterialStageProperties() { setupStageFlag("MaterialStageFlagMaskRed", IShaderLayer::FLAG_MASK_RED); @@ -490,6 +503,16 @@ void MaterialEditor::setupMaterialStageProperties() _stageBindings.emplace(std::make_shared>(getControl("MaterialStageColored"), [](const IShaderLayer::Ptr& layer) { return (layer->getParseFlags() & IShaderLayer::PF_HasColoredKeyword) != 0; })); + 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); }); + createRadioButtonBinding("MaterialStageVertexColourFlag", + [](const IShaderLayer::Ptr& layer) { return layer->getVertexColourMode() == IShaderLayer::VERTEX_COLOUR_MULTIPLY; }, + [](const IEditableShaderLayer::Ptr& layer, bool value) { if (value) layer->setVertexColourMode(IShaderLayer::VERTEX_COLOUR_MULTIPLY); }); + createRadioButtonBinding("MaterialStageInverseVertexColourFlag", + [](const IShaderLayer::Ptr& layer) { return layer->getVertexColourMode() == IShaderLayer::VERTEX_COLOUR_INVERSE_MULTIPLY; }, + [](const IEditableShaderLayer::Ptr& layer, bool value) { if (value) layer->setVertexColourMode(IShaderLayer::VERTEX_COLOUR_INVERSE_MULTIPLY); }); + createExpressionBinding("MaterialStageRed", [](const IShaderLayer::Ptr& layer) { return layer->getColourExpression(IShaderLayer::COMP_RED); }, [](const IEditableShaderLayer::Ptr& layer, const std::string& value) { layer->setColourExpressionFromString(IShaderLayer::COMP_RED, value); }); diff --git a/radiant/ui/materials/MaterialEditor.h b/radiant/ui/materials/MaterialEditor.h index f63ec27e3b..624c3fa3e9 100644 --- a/radiant/ui/materials/MaterialEditor.h +++ b/radiant/ui/materials/MaterialEditor.h @@ -102,7 +102,10 @@ class MaterialEditor : void createExpressionBinding(const std::string& textCtrlName, const std::function& loadFunc, - const std::function& saveFunc = std::function()); + const std::function& saveFunc); + void createRadioButtonBinding(const std::string& ctrlName, + const std::function& loadFunc, + const std::function& saveFunc); void updateControlsFromMaterial(); void updateDeformControlsFromMaterial(); diff --git a/radiant/ui/materials/RadioButtonBinding.h b/radiant/ui/materials/RadioButtonBinding.h new file mode 100644 index 0000000000..9f2ecca7da --- /dev/null +++ b/radiant/ui/materials/RadioButtonBinding.h @@ -0,0 +1,68 @@ +#pragma once + +#include "Binding.h" +#include "ishaderlayer.h" +#include + +namespace ui +{ + +class RadioButtonBinding : + public TwoWayBinding +{ +private: + wxRadioButton* _radioButton; + std::function _getValue; + std::function _updateValue; + std::function _postChangeNotify; + +public: + RadioButtonBinding(wxRadioButton* radioButton, + const std::function& loadFunc, + const std::function& acquireSaveTarget, + const std::function& saveFunc, + const std::function& postChangeNotify = std::function()) : + TwoWayBinding(acquireSaveTarget), + _radioButton(radioButton), + _getValue(loadFunc), + _updateValue(saveFunc), + _postChangeNotify(postChangeNotify) + { + if (_updateValue) + { + _radioButton->Bind(wxEVT_RADIOBUTTON, &RadioButtonBinding::onValueChanged, this); + } + } + + virtual void updateFromSource() override + { + util::ScopedBoolLock lock(_blockUpdates); + + if (!getSource()) + { + _radioButton->SetValue(false); + return; + } + + auto value = _getValue(getSource()); + _radioButton->SetValue(value); + } + +private: + void onValueChanged(wxCommandEvent& ev) + { + auto target = getTarget(); + + if (target) + { + _updateValue(target, _radioButton->GetValue()); + } + + if (_postChangeNotify) + { + _postChangeNotify(); + } + } +}; + +} diff --git a/radiantcore/shaders/Doom3ShaderLayer.h b/radiantcore/shaders/Doom3ShaderLayer.h index d8174dadae..d4402e2829 100644 --- a/radiantcore/shaders/Doom3ShaderLayer.h +++ b/radiantcore/shaders/Doom3ShaderLayer.h @@ -301,7 +301,7 @@ class Doom3ShaderLayer : * \brief * Set vertex colour mode. */ - void setVertexColourMode(VertexColourMode mode) + void setVertexColourMode(VertexColourMode mode) override { _vertexColourMode = mode; } diff --git a/tools/msvc/DarkRadiant.vcxproj b/tools/msvc/DarkRadiant.vcxproj index 4e7eccf55b..e1c3b7ed02 100644 --- a/tools/msvc/DarkRadiant.vcxproj +++ b/tools/msvc/DarkRadiant.vcxproj @@ -463,6 +463,7 @@ + diff --git a/tools/msvc/DarkRadiant.vcxproj.filters b/tools/msvc/DarkRadiant.vcxproj.filters index e542cb4f90..9ee261742c 100644 --- a/tools/msvc/DarkRadiant.vcxproj.filters +++ b/tools/msvc/DarkRadiant.vcxproj.filters @@ -1356,6 +1356,9 @@ src\ui\materials + + src\ui\materials +