From d685ffc6bed626f11caf097bc22fb4363b568034 Mon Sep 17 00:00:00 2001 From: codereader Date: Sun, 21 Feb 2021 13:02:35 +0100 Subject: [PATCH] #5532: Set up stage flag bindings --- install/ui/materialeditor.fbp | 16 ++--- install/ui/materialeditor.xrc | 16 ++--- radiant/ui/materials/MaterialBinding.h | 15 ++-- radiant/ui/materials/MaterialEditor.cpp | 95 +++++++++++++++---------- radiant/ui/materials/MaterialEditor.h | 10 +-- 5 files changed, 88 insertions(+), 64 deletions(-) diff --git a/install/ui/materialeditor.fbp b/install/ui/materialeditor.fbp index bc72e44009..23fdb56012 100644 --- a/install/ui/materialeditor.fbp +++ b/install/ui/materialeditor.fbp @@ -9629,7 +9629,7 @@ Blending - 0 + 1 1 1 @@ -10324,7 +10324,7 @@ 0 1 - maskRed + MaterialStageFlagMaskRed 1 @@ -10388,7 +10388,7 @@ 0 1 - maskRed1 + MaterialStageFlagMaskGreen 1 @@ -10452,7 +10452,7 @@ 0 1 - maskRed2 + MaterialStageFlagMaskBlue 1 @@ -10516,7 +10516,7 @@ 0 1 - maskRed3 + MaterialStageFlagMaskAlpha 1 @@ -10580,7 +10580,7 @@ 0 1 - maskRed4 + MaterialStageFlagMaskColour 1 @@ -10644,7 +10644,7 @@ 0 1 - maskRed5 + MaterialStageFlagMaskDepth 1 @@ -15366,7 +15366,7 @@ Vertex Colour - 1 + 0 1 1 diff --git a/install/ui/materialeditor.xrc b/install/ui/materialeditor.xrc index 623b232f8f..7bf7bd69d3 100644 --- a/install/ui/materialeditor.xrc +++ b/install/ui/materialeditor.xrc @@ -1637,7 +1637,7 @@ - 0 + 1 @@ -1751,7 +1751,7 @@ wxALIGN_CENTER_VERTICAL 0 - + 1 @@ -1760,7 +1760,7 @@ wxALIGN_CENTER_VERTICAL|wxLEFT 6 - + 1 @@ -1769,7 +1769,7 @@ wxALIGN_CENTER_VERTICAL|wxLEFT 6 - + 1 @@ -1778,7 +1778,7 @@ wxALIGN_CENTER_VERTICAL|wxLEFT 6 - + 1 @@ -1787,7 +1787,7 @@ wxALIGN_CENTER_VERTICAL|wxLEFT 6 - + 1 @@ -1796,7 +1796,7 @@ wxALIGN_CENTER_VERTICAL|wxLEFT 6 - + 1 @@ -2606,7 +2606,7 @@ - 1 + 0 diff --git a/radiant/ui/materials/MaterialBinding.h b/radiant/ui/materials/MaterialBinding.h index b8aa043bbb..a3153f0658 100644 --- a/radiant/ui/materials/MaterialBinding.h +++ b/radiant/ui/materials/MaterialBinding.h @@ -36,30 +36,29 @@ class Binding } }; -using MaterialBinding = Binding; - +template class CheckBoxBinding : - public MaterialBinding + public Binding { private: wxCheckBox* _checkbox; - std::function _loadFunc; + std::function _loadFunc; public: - CheckBoxBinding(wxCheckBox* checkbox, const std::function loadFunc) : + CheckBoxBinding(wxCheckBox* checkbox, const std::function loadFunc) : _checkbox(checkbox), _loadFunc(loadFunc) {} - virtual void updateFromSource(const MaterialPtr& material) override + virtual void updateFromSource(const Source& source) override { - if (!getSource()) + if (!source) { _checkbox->SetValue(false); return; } - _checkbox->SetValue(_loadFunc(getSource())); + _checkbox->SetValue(_loadFunc(source)); } }; diff --git a/radiant/ui/materials/MaterialEditor.cpp b/radiant/ui/materials/MaterialEditor.cpp index 27ae5b92ef..3151de89e0 100644 --- a/radiant/ui/materials/MaterialEditor.cpp +++ b/radiant/ui/materials/MaterialEditor.cpp @@ -84,6 +84,7 @@ MaterialEditor::MaterialEditor() : setupMaterialProperties(); setupMaterialStageView(); + setupMaterialStageProperties(); setupMaterialSurfaceFlags(); setupMaterialShaderFlags(); setupMaterialLightFlags(); @@ -156,13 +157,13 @@ void MaterialEditor::setupMaterialProperties() sortDropdown->AppendString(pair.first); } - _materialBindings.emplace(std::make_shared(getControl("MaterialHasSortValue"), + _materialBindings.emplace(std::make_shared>(getControl("MaterialHasSortValue"), [](const MaterialPtr& material) { return (material->getParseFlags() & Material::PF_HasSortDefined) != 0; })); } void MaterialEditor::setupSurfaceFlag(const std::string& controlName, Material::SurfaceFlags flag) { - _materialBindings.emplace(std::make_shared(getControl(controlName), + _materialBindings.emplace(std::make_shared>(getControl(controlName), [=](const MaterialPtr& material) { return (material->getSurfaceFlags() & flag) != 0; @@ -171,7 +172,7 @@ void MaterialEditor::setupSurfaceFlag(const std::string& controlName, Material:: void MaterialEditor::setupMaterialFlag(const std::string& controlName, Material::Flags flag) { - _materialBindings.emplace(std::make_shared(getControl(controlName), + _materialBindings.emplace(std::make_shared>(getControl(controlName), [=](const MaterialPtr& material) { return (material->getMaterialFlags() & flag) != 0; @@ -180,19 +181,19 @@ void MaterialEditor::setupMaterialFlag(const std::string& controlName, Material: void MaterialEditor::setupMaterialLightFlags() { - _materialBindings.emplace(std::make_shared(getControl("MaterialIsAmbientLight"), + _materialBindings.emplace(std::make_shared>(getControl("MaterialIsAmbientLight"), [](const MaterialPtr& material) { return material->isAmbientLight(); })); - _materialBindings.emplace(std::make_shared(getControl("MaterialIsAmbientCubicLight"), + _materialBindings.emplace(std::make_shared>(getControl("MaterialIsAmbientCubicLight"), [](const MaterialPtr& material) { return material->isAmbientLight() && material->isCubicLight(); })); - _materialBindings.emplace(std::make_shared(getControl("MaterialIsFogLight"), + _materialBindings.emplace(std::make_shared>(getControl("MaterialIsFogLight"), [](const MaterialPtr& material) { return material->isFogLight(); })); - _materialBindings.emplace(std::make_shared(getControl("MaterialIsCubicLight"), + _materialBindings.emplace(std::make_shared>(getControl("MaterialIsCubicLight"), [](const MaterialPtr& material) { return material->isCubicLight(); })); - _materialBindings.emplace(std::make_shared(getControl("MaterialIsBlendLight"), + _materialBindings.emplace(std::make_shared>(getControl("MaterialIsBlendLight"), [](const MaterialPtr& material) { return material->isBlendLight(); })); } @@ -213,51 +214,51 @@ void MaterialEditor::setupMaterialShaderFlags() setupMaterialFlag("MaterialFlagIsLightGemSurf", Material::FLAG_ISLIGHTGEMSURF); // Cull types - _materialBindings.emplace(std::make_shared(getControl("MaterialTwoSided"), + _materialBindings.emplace(std::make_shared>(getControl("MaterialTwoSided"), [](const MaterialPtr& material) { return material->getCullType() == Material::CULL_NONE; })); - _materialBindings.emplace(std::make_shared(getControl("MaterialBackSided"), + _materialBindings.emplace(std::make_shared>(getControl("MaterialBackSided"), [](const MaterialPtr& material) { return material->getCullType() == Material::CULL_FRONT; })); // Global Clamping - _materialBindings.emplace(std::make_shared(getControl("MaterialFlagClamp"), + _materialBindings.emplace(std::make_shared>(getControl("MaterialFlagClamp"), [](const MaterialPtr& material) { return material->getClampType() == CLAMP_NOREPEAT; })); - _materialBindings.emplace(std::make_shared(getControl("MaterialFlagZeroClamp"), + _materialBindings.emplace(std::make_shared>(getControl("MaterialFlagZeroClamp"), [](const MaterialPtr& material) { return material->getClampType() == CLAMP_ZEROCLAMP; })); - _materialBindings.emplace(std::make_shared(getControl("MaterialFlagAlphaZeroClamp"), + _materialBindings.emplace(std::make_shared>(getControl("MaterialFlagAlphaZeroClamp"), [](const MaterialPtr& material) { return material->getClampType() == CLAMP_ALPHAZEROCLAMP; })); // DECAL_MACRO - _materialBindings.emplace(std::make_shared(getControl("MaterialHasDecalMacro"), + _materialBindings.emplace(std::make_shared>(getControl("MaterialHasDecalMacro"), [](const MaterialPtr& material) { return material->getParseFlags() & Material::PF_HasDecalMacro; })); // TWOSIDED_DECAL_MACRO - _materialBindings.emplace(std::make_shared(getControl("MaterialHasTwoSidedDecalMacro"), + _materialBindings.emplace(std::make_shared>(getControl("MaterialHasTwoSidedDecalMacro"), [](const MaterialPtr& material) { return material->getParseFlags() & Material::PF_HasTwoSidedDecalMacro; })); // GLASS_MACRO - _materialBindings.emplace(std::make_shared(getControl("MaterialHasGlassMacro"), + _materialBindings.emplace(std::make_shared>(getControl("MaterialHasGlassMacro"), [](const MaterialPtr& material) { return material->getParseFlags() & Material::PF_HasGlassMacro; })); // PARTICLE_MACRO - _materialBindings.emplace(std::make_shared(getControl("MaterialHasParticleMacro"), + _materialBindings.emplace(std::make_shared>(getControl("MaterialHasParticleMacro"), [](const MaterialPtr& material) { return material->getParseFlags() & Material::PF_HasParticleMacro; })); } @@ -322,6 +323,25 @@ void MaterialEditor::setupMaterialStageView() _stageView->Bind(wxEVT_DATAVIEW_SELECTION_CHANGED, &MaterialEditor::_onStageListSelectionChanged, this); } +void MaterialEditor::setupStageFlag(const std::string& controlName, int flags) +{ + _stageBindings.emplace(std::make_shared>(getControl(controlName), + [=](const ShaderLayerPtr& layer) + { + return (layer->getStageFlags() & flags) == flags; + })); +} + +void MaterialEditor::setupMaterialStageProperties() +{ + setupStageFlag("MaterialStageFlagMaskRed", ShaderLayer::FLAG_MASK_RED); + setupStageFlag("MaterialStageFlagMaskGreen", ShaderLayer::FLAG_MASK_GREEN); + setupStageFlag("MaterialStageFlagMaskBlue", ShaderLayer::FLAG_MASK_BLUE); + setupStageFlag("MaterialStageFlagMaskAlpha", ShaderLayer::FLAG_MASK_ALPHA); + setupStageFlag("MaterialStageFlagMaskColour", ShaderLayer::FLAG_MASK_RED|ShaderLayer::FLAG_MASK_GREEN|ShaderLayer::FLAG_MASK_BLUE); + setupStageFlag("MaterialStageFlagMaskDepth", ShaderLayer::FLAG_MASK_DEPTH); +} + void MaterialEditor::_onTreeViewSelectionChanged(wxDataViewEvent& ev) { // Update the preview if a texture is selected @@ -339,7 +359,7 @@ void MaterialEditor::_onTreeViewSelectionChanged(wxDataViewEvent& ev) void MaterialEditor::_onStageListSelectionChanged(wxDataViewEvent& ev) { - updateStageControlsFromMaterial(); + updateStageControlsFromSelectedStage(); } void MaterialEditor::updateControlsFromMaterial() @@ -596,7 +616,7 @@ void MaterialEditor::selectStageByIndex(std::size_t index) if (item.IsOk()) { _stageView->Select(item); - updateStageControlsFromMaterial(); + updateStageControlsFromSelectedStage(); } else { @@ -604,24 +624,11 @@ void MaterialEditor::selectStageByIndex(std::size_t index) } } -void MaterialEditor::updateStageControlsFromLayer(const ShaderLayer& layer) +ShaderLayerPtr MaterialEditor::getSelectedStage() { - // TODO -} - -void MaterialEditor::updateStageControlsFromMaterial() -{ - // Update all registered bindings - for (const auto& binding : _stageBindings) - { - binding->setSource(_material); - } - auto selectedStageItem = _stageView->GetSelection(); - getControl("MaterialEditorStageSettingsPanel")->Enable(selectedStageItem.IsOk()); - - if (!selectedStageItem.IsOk() || !_material) return; + if (!selectedStageItem.IsOk() || !_material) return ShaderLayerPtr(); const auto& layers = _material->getAllLayers(); wxutil::TreeModel::Row stageRow(selectedStageItem, *_stageList); @@ -629,9 +636,25 @@ void MaterialEditor::updateStageControlsFromMaterial() if (stageIndex >= 0 && stageIndex < layers.size()) { - const auto& layer = layers[stageIndex]; - updateStageControlsFromLayer(*layer); + return layers[stageIndex]; } + + return ShaderLayerPtr(); +} + +void MaterialEditor::updateStageControlsFromSelectedStage() +{ + auto selectedStage = getSelectedStage(); + + // Update all registered bindings + for (const auto& binding : _stageBindings) + { + binding->setSource(selectedStage); + } + + getControl("MaterialEditorStageSettingsPanel")->Enable(selectedStage != nullptr); + + } } diff --git a/radiant/ui/materials/MaterialEditor.h b/radiant/ui/materials/MaterialEditor.h index fe3c396433..d3719d4c9e 100644 --- a/radiant/ui/materials/MaterialEditor.h +++ b/radiant/ui/materials/MaterialEditor.h @@ -34,8 +34,8 @@ class MaterialEditor : MaterialPtr _material; - std::set> _materialBindings; - std::set> _stageBindings; + std::set>> _materialBindings; + std::set>> _stageBindings; std::map _deformPanels; private: @@ -50,6 +50,7 @@ class MaterialEditor : private: void setupMaterialStageView(); + void setupMaterialStageProperties(); void setupMaterialProperties(); void setupMaterialSurfaceFlags(); void setupMaterialShaderFlags(); @@ -57,6 +58,7 @@ class MaterialEditor : void setupMaterialDeformPage(); void setupSurfaceFlag(const std::string& controlName, Material::SurfaceFlags flag); void setupMaterialFlag(const std::string& controlName, Material::Flags flag); + void setupStageFlag(const std::string& controlName, int flags); void updateControlsFromMaterial(); void updateDeformControlsFromMaterial(); @@ -64,9 +66,9 @@ class MaterialEditor : void updateMaterialPropertiesFromMaterial(); void selectStageByIndex(std::size_t index); + ShaderLayerPtr getSelectedStage(); - void updateStageControlsFromMaterial(); - void updateStageControlsFromLayer(const ShaderLayer& layer); + void updateStageControlsFromSelectedStage(); void _onTreeViewSelectionChanged(wxDataViewEvent& ev); void _onStageListSelectionChanged(wxDataViewEvent& ev);