Skip to content

Commit b53e5cd

Browse files
committed
RenderedTarget: Inherit skins from clone root
1 parent af14d11 commit b53e5cd

File tree

2 files changed

+24
-4
lines changed

2 files changed

+24
-4
lines changed

src/renderedtarget.cpp

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,10 @@ RenderedTarget::RenderedTarget(QNanoQuickItem *parent) :
2525

2626
RenderedTarget::~RenderedTarget()
2727
{
28-
for (const auto &[costume, skin] : m_skins)
29-
delete skin;
28+
if (!m_skinsInherited) {
29+
for (const auto &[costume, skin] : m_skins)
30+
delete skin;
31+
}
3032
}
3133

3234
void RenderedTarget::updateVisibility(bool visible)
@@ -121,9 +123,12 @@ bool RenderedTarget::costumesLoaded() const
121123
void RenderedTarget::loadCostumes()
122124
{
123125
// Delete previous skins
124-
for (const auto &[costume, skin] : m_skins)
125-
delete skin;
126+
if (!m_skinsInherited) {
127+
for (const auto &[costume, skin] : m_skins)
128+
delete skin;
129+
}
126130

131+
m_skinsInherited = false;
127132
m_skins.clear();
128133

129134
// Generate a skin for each costume
@@ -227,6 +232,20 @@ void RenderedTarget::setSpriteModel(SpriteModel *newSpriteModel)
227232
m_spriteModel = newSpriteModel;
228233

229234
if (m_spriteModel) {
235+
SpriteModel *cloneRoot = m_spriteModel->cloneRoot();
236+
237+
if (cloneRoot) {
238+
// Inherit skins from the clone root
239+
RenderedTarget *target = dynamic_cast<RenderedTarget *>(cloneRoot->renderedTarget());
240+
Q_ASSERT(target);
241+
242+
if (target->costumesLoaded()) {
243+
m_skins = target->m_skins; // TODO: Avoid copying - maybe using a pointer?
244+
m_costumesLoaded = true;
245+
m_skinsInherited = true; // avoid double free
246+
}
247+
}
248+
230249
Sprite *sprite = m_spriteModel->sprite();
231250

232251
if (sprite) {

src/renderedtarget.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ class RenderedTarget : public IRenderedTarget
112112
SceneMouseArea *m_mouseArea = nullptr;
113113
bool m_costumesLoaded = false;
114114
std::unordered_map<libscratchcpp::Costume *, Skin *> m_skins;
115+
bool m_skinsInherited = false;
115116
Skin *m_skin = nullptr;
116117
Texture m_texture;
117118
Texture m_oldTexture;

0 commit comments

Comments
 (0)