Skip to content

Commit

Permalink
Fix (potential) crashes due to wrong lambda captures. Disconnect from…
Browse files Browse the repository at this point in the history
… materials when closing the editor.
  • Loading branch information
codereader committed Jul 31, 2021
1 parent 2353158 commit 6743a34
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 7 deletions.
13 changes: 7 additions & 6 deletions radiant/ui/materials/editor/MaterialEditor.cpp
Expand Up @@ -181,6 +181,7 @@ MaterialEditor::MaterialEditor() :

MaterialEditor::~MaterialEditor()
{
_materialChanged.disconnect();
_materialBindings.clear();
_stageBindings.clear();

Expand Down Expand Up @@ -819,7 +820,7 @@ void MaterialEditor::setupMaterialShaderFlags()
cullTypes->AppendString(pair.first);
}

cullTypes->Bind(wxEVT_CHOICE, [=](wxCommandEvent& ev)
cullTypes->Bind(wxEVT_CHOICE, [this, cullTypes](wxCommandEvent& ev)
{
if (!_material || _materialUpdateInProgress) return;
_material->setCullType(shaders::getCullTypeForString(cullTypes->GetStringSelection().ToStdString()));
Expand Down Expand Up @@ -847,22 +848,22 @@ void MaterialEditor::setupMaterialShaderFlags()
// DECAL_MACRO
_materialBindings.emplace(std::make_shared<CheckBoxBinding<MaterialPtr>>(getControl<wxCheckBox>("MaterialHasDecalMacro"),
[](const MaterialPtr& material) { return material->getParseFlags() & Material::PF_HasDecalMacro; },
[=](const MaterialPtr& material, const bool& newValue) {}));
[](const MaterialPtr& material, const bool& newValue) {}));

// TWOSIDED_DECAL_MACRO
_materialBindings.emplace(std::make_shared<CheckBoxBinding<MaterialPtr>>(getControl<wxCheckBox>("MaterialHasTwoSidedDecalMacro"),
[](const MaterialPtr& material) { return material->getParseFlags() & Material::PF_HasTwoSidedDecalMacro; },
[=](const MaterialPtr& material, const bool& newValue) {}));
[](const MaterialPtr& material, const bool& newValue) {}));

// GLASS_MACRO
_materialBindings.emplace(std::make_shared<CheckBoxBinding<MaterialPtr>>(getControl<wxCheckBox>("MaterialHasGlassMacro"),
[](const MaterialPtr& material) { return material->getParseFlags() & Material::PF_HasGlassMacro; },
[=](const MaterialPtr& material, const bool& newValue) {}));
[](const MaterialPtr& material, const bool& newValue) {}));

// PARTICLE_MACRO
_materialBindings.emplace(std::make_shared<CheckBoxBinding<MaterialPtr>>(getControl<wxCheckBox>("MaterialHasParticleMacro"),
[](const MaterialPtr& material) { return material->getParseFlags() & Material::PF_HasParticleMacro; },
[=](const MaterialPtr& material, const bool& newValue) {}));
[](const MaterialPtr& material, const bool& newValue) {}));
}

void MaterialEditor::setupMaterialSurfaceFlags()
Expand Down Expand Up @@ -1269,7 +1270,7 @@ void MaterialEditor::setupMaterialStageProperties()

_stageBindings.emplace(std::make_shared<CheckBoxBinding<IShaderLayer::Ptr>>(getControl<wxCheckBox>("MaterialStageColored"),
[](const IShaderLayer::Ptr& layer) { return stageQualifiesAsColoured(layer); },
[=](const IEditableShaderLayer::Ptr& layer, const bool& value) { _onStageColoredChecked(layer, value); },
[this](const IEditableShaderLayer::Ptr& layer, const bool& value) { _onStageColoredChecked(layer, value); },
std::bind(&MaterialEditor::onMaterialChanged, this),
std::bind(&MaterialEditor::getEditableStageForSelection, this)));

Expand Down
4 changes: 3 additions & 1 deletion radiant/ui/materials/editor/MaterialEditor.h
@@ -1,6 +1,7 @@
#pragma once

#include <sigc++/connection.h>
#include <sigc++/trackable.h>
#include "icommandsystem.h"
#include "ishaders.h"

Expand All @@ -19,7 +20,8 @@ namespace ui

class MaterialEditor :
public wxutil::DialogBase,
private wxutil::XmlResourceBasedWidget
private wxutil::XmlResourceBasedWidget,
public sigc::trackable
{
private:
MaterialTreeView* _treeView;
Expand Down

0 comments on commit 6743a34

Please sign in to comment.