Skip to content

Commit 4b51036

Browse files
committed
🐛 Fixed crash in aero dashboard when resuming game.
Caused by bad material cleanup, introduced in 1cbf91f with the mouse-hover highlights.
1 parent 4eb1a45 commit 4b51036

File tree

2 files changed

+32
-3
lines changed

2 files changed

+32
-3
lines changed

source/main/gui/OverlayWrapper.cpp

+26-3
Original file line numberDiff line numberDiff line change
@@ -1080,7 +1080,14 @@ void AeroEngineWidget::Setup(std::string const& engfire_elemname, std::string co
10801080
// Because highlighting works on per-material basis, we must clone the material for each element
10811081
engfire_element = Ogre::OverlayManager::getSingleton().getOverlayElement(engfire_elemname);
10821082
thr_element = Ogre::OverlayManager::getSingleton().getOverlayElement(thr_elemname);
1083-
thr_element->setMaterial(thr_element->getMaterial()->clone(thr_element->getMaterial()->getName() + "@" + thr_elemname));
1083+
thr_material = thr_element->getMaterial()->clone(thr_element->getMaterial()->getName() + "@" + thr_elemname);
1084+
thr_element->setMaterial(thr_material);
1085+
}
1086+
1087+
AeroEngineWidget::~AeroEngineWidget()
1088+
{
1089+
// Remove cloned materials
1090+
Ogre::MaterialManager::getSingleton().remove(thr_material);
10841091
}
10851092

10861093
bool AeroEngineWidget::UpdateMouseHover()
@@ -1119,6 +1126,13 @@ void AeroSwitchWidget::Setup(std::string const & elem_name, std::string const &
11191126
off_material = Ogre::MaterialManager::getSingleton().getByName(mat_off)->clone(elem_name + "@" + mat_off);
11201127
}
11211128

1129+
AeroSwitchWidget::~AeroSwitchWidget()
1130+
{
1131+
// Remove cloned materials
1132+
Ogre::MaterialManager::getSingleton().remove(on_material);
1133+
Ogre::MaterialManager::getSingleton().remove(off_material);
1134+
}
1135+
11221136
bool AeroSwitchWidget::UpdateMouseHover()
11231137
{
11241138
// Element's current material switches dynamically based on game state, we must always sync both variants.
@@ -1150,9 +1164,18 @@ void AeroTrimWidget::Setup(std::string const & up, std::string const & dn, std::
11501164
// Because highlighting works on per-material basis, we must clone the material for each element
11511165
display = Ogre::OverlayManager::getSingleton().getOverlayElement(disp);
11521166
up_button = Ogre::OverlayManager::getSingleton().getOverlayElement(up);
1153-
up_button->setMaterial(up_button->getMaterial()->clone(up + "$" + disp));
1167+
up_material = up_button->getMaterial()->clone(up + "$" + disp);
1168+
up_button->setMaterial(up_material);
11541169
dn_button = Ogre::OverlayManager::getSingleton().getOverlayElement(dn);
1155-
dn_button->setMaterial(dn_button->getMaterial()->clone(dn + "$" + disp));
1170+
down_material = dn_button->getMaterial()->clone(dn + "$" + disp);
1171+
dn_button->setMaterial(down_material);
1172+
}
1173+
1174+
AeroTrimWidget::~AeroTrimWidget()
1175+
{
1176+
// Remove cloned materials
1177+
Ogre::MaterialManager::getSingleton().remove(up_material);
1178+
Ogre::MaterialManager::getSingleton().remove(down_material);
11561179
}
11571180

11581181
bool AeroTrimWidget::UpdateMouseHover()

source/main/gui/OverlayWrapper.h

+6
Original file line numberDiff line numberDiff line change
@@ -44,11 +44,13 @@ struct AeroInteractiveWidget
4444

4545
struct AeroEngineWidget : public AeroInteractiveWidget
4646
{
47+
~AeroEngineWidget();
4748
void Setup(std::string const& engfire_elemname, std::string const& thr_elemname);
4849
bool UpdateMouseHover() override;
4950
Ogre::OverlayElement* GetHoveredElement() const override;
5051

5152
Ogre::OverlayElement *thr_element;
53+
Ogre::MaterialPtr thr_material;
5254
Ogre::OverlayElement *engfire_element;
5355
Ogre::TextureUnitState *rpm_texture;
5456
Ogre::TextureUnitState *pitch_texture;
@@ -57,6 +59,7 @@ struct AeroEngineWidget : public AeroInteractiveWidget
5759

5860
struct AeroSwitchWidget: public AeroInteractiveWidget
5961
{
62+
~AeroSwitchWidget();
6063
void Setup(std::string const & elem_name, std::string const & mat_on, std::string const & mat_off);
6164
void SetActive(bool value);
6265
bool UpdateMouseHover() override;
@@ -69,6 +72,7 @@ struct AeroSwitchWidget: public AeroInteractiveWidget
6972

7073
struct AeroTrimWidget : public AeroInteractiveWidget
7174
{
75+
~AeroTrimWidget();
7276
void Setup(std::string const & up, std::string const & dn, std::string const & disp);
7377
void DisplayFormat(const char* fmt, ...);
7478
bool UpdateMouseHover() override;
@@ -78,6 +82,8 @@ struct AeroTrimWidget : public AeroInteractiveWidget
7882
Ogre::OverlayElement *dn_button;
7983
Ogre::OverlayElement* hovered_button = nullptr;
8084
Ogre::OverlayElement *display;
85+
Ogre::MaterialPtr up_material;
86+
Ogre::MaterialPtr down_material;
8187
};
8288

8389
struct AeroDashOverlay

0 commit comments

Comments
 (0)