Skip to content

Commit

Permalink
#5532: Add binding to privatePolygonOffset. Map type selection WIP.
Browse files Browse the repository at this point in the history
  • Loading branch information
codereader committed Mar 20, 2021
1 parent 915fc72 commit 7c9c562
Show file tree
Hide file tree
Showing 9 changed files with 1,085 additions and 790 deletions.
3 changes: 3 additions & 0 deletions include/ishaderlayer.h
Expand Up @@ -439,4 +439,7 @@ class IEditableShaderLayer :

// Set the clamp type of this stage
virtual void setClampType(ClampType clampType) = 0;

// Sets the privatePolygonOffset value of this stage
virtual void setPrivatePolygonOffset(double offset) = 0;
};
1,522 changes: 839 additions & 683 deletions install/ui/materialeditor.fbp

Large diffs are not rendered by default.

199 changes: 104 additions & 95 deletions install/ui/materialeditor.xrc
Expand Up @@ -1996,25 +1996,28 @@
</object>
<object class="sizeritem">
<option>1</option>
<flag>wxEXPAND</flag>
<border>5</border>
<object class="wxBoxSizer">
<orient>wxHORIZONTAL</orient>
<object class="sizeritem">
<option>1</option>
<flag>wxALIGN_CENTER_VERTICAL|wxALL</flag>
<border>0</border>
<object class="wxTextCtrl" name="MaterialStageVideoMapFile">
<value></value>
<flag>wxEXPAND | wxALL</flag>
<border>0</border>
<object class="wxPanel" name="MaterialStageVideoMapPanel">
<style>wxTAB_TRAVERSAL</style>
<object class="wxBoxSizer">
<orient>wxHORIZONTAL</orient>
<object class="sizeritem">
<option>1</option>
<flag>wxALIGN_CENTER_VERTICAL|wxALL</flag>
<border>0</border>
<object class="wxTextCtrl" name="MaterialStageVideoMapFile">
<value></value>
</object>
</object>
</object>
<object class="sizeritem">
<option>0</option>
<flag>wxALIGN_CENTER_VERTICAL|wxLEFT</flag>
<border>6</border>
<object class="wxCheckBox" name="MaterialStageVideoMapLoop">
<label>Loop</label>
<checked>0</checked>
<object class="sizeritem">
<option>0</option>
<flag>wxALIGN_CENTER_VERTICAL|wxLEFT</flag>
<border>6</border>
<object class="wxCheckBox" name="MaterialStageVideoMapLoop">
<label>Loop</label>
<checked>0</checked>
</object>
</object>
</object>
</object>
Expand Down Expand Up @@ -2048,48 +2051,51 @@
</object>
<object class="sizeritem">
<option>1</option>
<flag>wxALIGN_CENTER_VERTICAL|wxEXPAND</flag>
<flag>wxEXPAND | wxALL</flag>
<border>0</border>
<object class="wxBoxSizer">
<orient>wxHORIZONTAL</orient>
<object class="sizeritem">
<option>0</option>
<flag>wxALIGN_CENTER_VERTICAL|wxRIGHT</flag>
<border>6</border>
<object class="wxStaticText" name="m_staticText87">
<label>Width:</label>
<wrap>-1</wrap>
<object class="wxPanel" name="MaterialStageRemoteRenderMapPanel">
<style>wxTAB_TRAVERSAL</style>
<object class="wxBoxSizer">
<orient>wxHORIZONTAL</orient>
<object class="sizeritem">
<option>0</option>
<flag>wxALIGN_CENTER_VERTICAL|wxRIGHT</flag>
<border>6</border>
<object class="wxStaticText" name="m_staticText87">
<label>Width:</label>
<wrap>-1</wrap>
</object>
</object>
</object>
<object class="sizeritem">
<option>0</option>
<flag>wxALIGN_CENTER_VERTICAL|wxALL</flag>
<border>0</border>
<object class="wxSpinCtrl" name="MaterialStageRemoteRenderMapWidth">
<style>wxSP_ARROW_KEYS</style>
<value>0</value>
<min>0</min>
<max>9999</max>
<object class="sizeritem">
<option>0</option>
<flag>wxALIGN_CENTER_VERTICAL|wxALL</flag>
<border>0</border>
<object class="wxSpinCtrl" name="MaterialStageRemoteRenderMapWidth">
<style>wxSP_ARROW_KEYS</style>
<value>0</value>
<min>0</min>
<max>9999</max>
</object>
</object>
</object>
<object class="sizeritem">
<option>0</option>
<flag>wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT</flag>
<border>12</border>
<object class="wxStaticText" name="m_staticText88">
<label>Height:</label>
<wrap>-1</wrap>
<object class="sizeritem">
<option>0</option>
<flag>wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT</flag>
<border>12</border>
<object class="wxStaticText" name="m_staticText88">
<label>Height:</label>
<wrap>-1</wrap>
</object>
</object>
</object>
<object class="sizeritem">
<option>0</option>
<flag>wxALIGN_CENTER_VERTICAL</flag>
<border>0</border>
<object class="wxSpinCtrl" name="MaterialStageRemoteRenderMapHeight">
<style>wxSP_ARROW_KEYS</style>
<value>0</value>
<min>0</min>
<max>9999</max>
<object class="sizeritem">
<option>0</option>
<flag>wxALIGN_CENTER_VERTICAL</flag>
<border>0</border>
<object class="wxSpinCtrl" name="MaterialStageRemoteRenderMapHeight">
<style>wxSP_ARROW_KEYS</style>
<value>0</value>
<min>0</min>
<max>9999</max>
</object>
</object>
</object>
</object>
Expand All @@ -2105,48 +2111,51 @@
</object>
<object class="sizeritem">
<option>1</option>
<flag>wxEXPAND</flag>
<border>5</border>
<object class="wxBoxSizer">
<orient>wxHORIZONTAL</orient>
<object class="sizeritem">
<option>0</option>
<flag>wxALIGN_CENTER_VERTICAL|wxRIGHT</flag>
<border>6</border>
<object class="wxStaticText" name="m_staticText871">
<label>Width:</label>
<wrap>-1</wrap>
<flag>wxEXPAND | wxALL</flag>
<border>0</border>
<object class="wxPanel" name="MaterialStageMirrorRenderMapPanel">
<style>wxTAB_TRAVERSAL</style>
<object class="wxBoxSizer">
<orient>wxHORIZONTAL</orient>
<object class="sizeritem">
<option>0</option>
<flag>wxALIGN_CENTER_VERTICAL|wxRIGHT</flag>
<border>6</border>
<object class="wxStaticText" name="m_staticText871">
<label>Width:</label>
<wrap>-1</wrap>
</object>
</object>
</object>
<object class="sizeritem">
<option>0</option>
<flag>wxALIGN_CENTER_VERTICAL|wxALL</flag>
<border>0</border>
<object class="wxSpinCtrl" name="MaterialStageMirrorRenderMapWidth">
<style>wxSP_ARROW_KEYS</style>
<value>0</value>
<min>0</min>
<max>9999</max>
<object class="sizeritem">
<option>0</option>
<flag>wxALIGN_CENTER_VERTICAL|wxALL</flag>
<border>0</border>
<object class="wxSpinCtrl" name="MaterialStageMirrorRenderMapWidth">
<style>wxSP_ARROW_KEYS</style>
<value>0</value>
<min>0</min>
<max>9999</max>
</object>
</object>
</object>
<object class="sizeritem">
<option>0</option>
<flag>wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT</flag>
<border>12</border>
<object class="wxStaticText" name="m_staticText881">
<label>Height:</label>
<wrap>-1</wrap>
<object class="sizeritem">
<option>0</option>
<flag>wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT</flag>
<border>12</border>
<object class="wxStaticText" name="m_staticText881">
<label>Height:</label>
<wrap>-1</wrap>
</object>
</object>
</object>
<object class="sizeritem">
<option>0</option>
<flag>wxALIGN_CENTER_VERTICAL</flag>
<border>0</border>
<object class="wxSpinCtrl" name="MaterialStageMirrorRenderMapHeight">
<style>wxSP_ARROW_KEYS</style>
<value>0</value>
<min>0</min>
<max>9999</max>
<object class="sizeritem">
<option>0</option>
<flag>wxALIGN_CENTER_VERTICAL</flag>
<border>0</border>
<object class="wxSpinCtrl" name="MaterialStageMirrorRenderMapHeight">
<style>wxSP_ARROW_KEYS</style>
<value>0</value>
<min>0</min>
<max>9999</max>
</object>
</object>
</object>
</object>
Expand Down
85 changes: 75 additions & 10 deletions radiant/ui/materials/MaterialEditor.cpp
Expand Up @@ -22,6 +22,7 @@
#include "materials/ParseLib.h"
#include "ExpressionBinding.h"
#include "RadioButtonBinding.h"
#include "SpinCtrlBinding.h"

namespace ui
{
Expand Down Expand Up @@ -409,6 +410,30 @@ void MaterialEditor::createRadioButtonBinding(const std::string& ctrlName,
std::bind(&MaterialEditor::onMaterialChanged, this)));
}

void MaterialEditor::createSpinCtrlBinding(const std::string& ctrlName,
const std::function<int(const IShaderLayer::Ptr&)>& loadFunc,
const std::function<void(const IEditableShaderLayer::Ptr&, int)>& saveFunc)
{
_stageBindings.emplace(std::make_shared<SpinCtrlBinding<wxSpinCtrl>>(
getControl<wxSpinCtrl>(ctrlName),
loadFunc,
std::bind(&MaterialEditor::getEditableStageForSelection, this),
saveFunc,
std::bind(&MaterialEditor::onMaterialChanged, this)));
}

void MaterialEditor::createSpinCtrlDoubleBinding(const std::string& ctrlName,
const std::function<double(const IShaderLayer::Ptr&)>& loadFunc,
const std::function<void(const IEditableShaderLayer::Ptr&, double)>& saveFunc)
{
_stageBindings.emplace(std::make_shared<SpinCtrlBinding<wxSpinCtrlDouble>>(
getControl<wxSpinCtrlDouble>(ctrlName),
loadFunc,
std::bind(&MaterialEditor::getEditableStageForSelection, this),
saveFunc,
std::bind(&MaterialEditor::onMaterialChanged, this)));
}

void MaterialEditor::setupMaterialStageProperties()
{
setupStageFlag("MaterialStageFlagMaskRed", IShaderLayer::FLAG_MASK_RED);
Expand All @@ -427,7 +452,11 @@ void MaterialEditor::setupMaterialStageProperties()

createExpressionBinding("MaterialStageAlphaTestExpression",
[](const IShaderLayer::Ptr& layer) { return layer->getAlphaTestExpression(); },
[](const IEditableShaderLayer::Ptr& layer, const std::string& value) { layer->setAlphaTestExpressionFromString(value); });
[this](const IEditableShaderLayer::Ptr& layer, const std::string& value)
{
layer->setAlphaTestExpressionFromString(value);
getControl<wxCheckBox>("MaterialStageHasAlphaTest")->SetValue(layer->hasAlphaTest());
});

for (const auto& value : {
"diffusemap", "bumpmap", "specularmap", "blend", "add", "filter", "modulate", "none", "Custom"
Expand Down Expand Up @@ -474,6 +503,46 @@ void MaterialEditor::setupMaterialStageProperties()
}
});

createRadioButtonBinding("MaterialStageVideoMap",
[](const IShaderLayer::Ptr& layer) { return layer->getMapType() == IShaderLayer::MapType::VideoMap; },
[this](const IEditableShaderLayer::Ptr& layer, bool value)
{
if (!value) return;
layer->setMapType(IShaderLayer::MapType::VideoMap);
updateStageControls();
});
createRadioButtonBinding("MaterialStageSoundMap",
[](const IShaderLayer::Ptr& layer) { return layer->getMapType() == IShaderLayer::MapType::SoundMap; },
[this](const IEditableShaderLayer::Ptr& layer, bool value)
{
if (!value) return;
layer->setMapType(IShaderLayer::MapType::SoundMap);
updateStageControls();
});
createRadioButtonBinding("MaterialStageRemoteRenderMap",
[](const IShaderLayer::Ptr& layer) { return layer->getMapType() == IShaderLayer::MapType::RemoteRenderMap; },
[this](const IEditableShaderLayer::Ptr& layer, bool value)
{
if (!value) return;
layer->setMapType(IShaderLayer::MapType::RemoteRenderMap);
updateStageControls();
});
createRadioButtonBinding("MaterialStageMirrorRenderMap",
[](const IShaderLayer::Ptr& layer) { return layer->getMapType() == IShaderLayer::MapType::MirrorRenderMap; },
[this](const IEditableShaderLayer::Ptr& layer, bool value)
{
if (!value) return;
layer->setMapType(IShaderLayer::MapType::MirrorRenderMap);
updateStageControls();
});

createSpinCtrlDoubleBinding("MaterialStagePrivatePolygonOffset",
[](const IShaderLayer::Ptr& layer) { return layer->getPrivatePolygonOffset(); },
[this](const IEditableShaderLayer::Ptr& layer, const double& value)
{
layer->setPrivatePolygonOffset(value);
});

// Texture
setupStageFlag("MaterialStageFilterNearest", IShaderLayer::FLAG_FILTER_NEAREST);
setupStageFlag("MaterialStageFilterLinear", IShaderLayer::FLAG_FILTER_LINEAR);
Expand Down Expand Up @@ -1191,8 +1260,6 @@ void MaterialEditor::updateStageControls()
{
selectedStage->evaluateExpressions(0); // initialise the values of this stage

getControl<wxSpinCtrlDouble>("MaterialStagePrivatePolygonOffset")->SetValue(selectedStage->getPrivatePolygonOffset());

auto mapExpr = selectedStage->getMapExpression();
auto imageMap = getControl<wxTextCtrl>("MaterialStageImageMap");
imageMap->SetValue(mapExpr ? mapExpr->getExpressionString() : "");
Expand All @@ -1207,7 +1274,6 @@ void MaterialEditor::updateStageControls()
});

auto mapTypeNotSpecial = getControl<wxRadioButton>("MaterialStageMapTypeNotSpecial");
auto specialMapPanel = getControl<wxPanel>("MaterialStageSpecialMapPanel");

auto videoMapFile = getControl<wxTextCtrl>("MaterialStageVideoMapFile");
auto videoMapLoop = getControl<wxCheckBox>("MaterialStageVideoMapLoop");
Expand All @@ -1228,13 +1294,11 @@ void MaterialEditor::updateStageControls()
{
mapType->SetStringSelection(_(SPECIAL_MAP_TYPE));
mapTypeNotSpecial->SetValue(false);
specialMapPanel->Enable();
imageMap->Disable();
}
else
{
mapTypeNotSpecial->SetValue(true);
specialMapPanel->Disable();
imageMap->Enable();
videoMapFile->SetValue("");
videoMapLoop->SetValue(false);
Expand Down Expand Up @@ -1279,10 +1343,11 @@ void MaterialEditor::updateStageControls()
break;
}

getControl<wxRadioButton>("MaterialStageVideoMap")->SetValue(selectedStage->getMapType() == IShaderLayer::MapType::VideoMap);
getControl<wxRadioButton>("MaterialStageSoundMap")->SetValue(selectedStage->getMapType() == IShaderLayer::MapType::SoundMap);
getControl<wxRadioButton>("MaterialStageRemoteRenderMap")->SetValue(selectedStage->getMapType() == IShaderLayer::MapType::RemoteRenderMap);
getControl<wxRadioButton>("MaterialStageMirrorRenderMap")->SetValue(selectedStage->getMapType() == IShaderLayer::MapType::MirrorRenderMap);
// Activate the controls next to the radio button
getControl<wxPanel>("MaterialStageVideoMapPanel")->Enable(getControl<wxRadioButton>("MaterialStageVideoMap")->GetValue());
getControl<wxCheckBox>("MaterialStageSoundMapWaveform")->Enable(getControl<wxRadioButton>("MaterialStageSoundMap")->GetValue());
getControl<wxPanel>("MaterialStageRemoteRenderMapPanel")->Enable(getControl<wxRadioButton>("MaterialStageRemoteRenderMap")->GetValue());
getControl<wxPanel>("MaterialStageMirrorRenderMapPanel")->Enable(getControl<wxRadioButton>("MaterialStageMirrorRenderMap")->GetValue());

// Vertex Colours
getControl<wxRadioButton>("MaterialStageNoVertexColourFlag")->SetValue(selectedStage->getVertexColourMode() == IShaderLayer::VERTEX_COLOUR_NONE);
Expand Down
7 changes: 7 additions & 0 deletions radiant/ui/materials/MaterialEditor.h
Expand Up @@ -107,6 +107,13 @@ class MaterialEditor :
const std::function<bool(const IShaderLayer::Ptr&)>& loadFunc,
const std::function<void(const IEditableShaderLayer::Ptr&, bool)>& saveFunc);

void createSpinCtrlBinding(const std::string& ctrlName,
const std::function<int(const IShaderLayer::Ptr&)>& loadFunc,
const std::function<void(const IEditableShaderLayer::Ptr&, int)>& saveFunc);
void createSpinCtrlDoubleBinding(const std::string& ctrlName,
const std::function<double(const IShaderLayer::Ptr&)>& loadFunc,
const std::function<void(const IEditableShaderLayer::Ptr&, double)>& saveFunc);

void updateControlsFromMaterial();
void updateDeformControlsFromMaterial();
void updateStageListFromMaterial();
Expand Down

0 comments on commit 7c9c562

Please sign in to comment.