Skip to content

Commit 42039c4

Browse files
committed
Engine: Use Drawable to store sorted targets
1 parent 3cdfe5c commit 42039c4

File tree

2 files changed

+50
-46
lines changed

2 files changed

+50
-46
lines changed

src/engine/internal/engine.cpp

Lines changed: 48 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ Engine::Engine() :
5353
Engine::~Engine()
5454
{
5555
m_clones.clear();
56-
m_executableTargets.clear();
56+
m_sortedDrawables.clear();
5757
}
5858

5959
void Engine::clear()
@@ -73,7 +73,7 @@ void Engine::clear()
7373
m_monitors.clear();
7474
m_extensions.clear();
7575
m_broadcastMap.clear();
76-
m_executableTargets.clear();
76+
m_sortedDrawables.clear();
7777
m_threads.clear();
7878
m_threadsToStop.clear();
7979
m_scripts.clear();
@@ -440,15 +440,15 @@ void Engine::initClone(std::shared_ptr<Sprite> clone)
440440
startHats(HatType::CloneInit, {}, clone.get());
441441

442442
assert(std::find(m_clones.begin(), m_clones.end(), clone) == m_clones.end());
443-
assert(std::find(m_executableTargets.begin(), m_executableTargets.end(), clone.get()) == m_executableTargets.end());
443+
assert(std::find(m_sortedDrawables.begin(), m_sortedDrawables.end(), clone.get()) == m_sortedDrawables.end());
444444
m_clones.insert(clone);
445-
m_executableTargets.push_back(clone.get()); // execution order needs to be updated after this
445+
m_sortedDrawables.push_back(clone.get()); // execution order needs to be updated after this
446446
}
447447

448448
void Engine::deinitClone(std::shared_ptr<Sprite> clone)
449449
{
450450
m_clones.erase(clone);
451-
m_executableTargets.erase(std::remove(m_executableTargets.begin(), m_executableTargets.end(), clone.get()), m_executableTargets.end());
451+
m_sortedDrawables.erase(std::remove(m_sortedDrawables.begin(), m_sortedDrawables.end(), clone.get()), m_sortedDrawables.end());
452452
}
453453

454454
void Engine::stopSounds()
@@ -1144,10 +1144,10 @@ const std::vector<std::shared_ptr<Target>> &Engine::targets() const
11441144
void Engine::setTargets(const std::vector<std::shared_ptr<Target>> &newTargets)
11451145
{
11461146
m_targets = newTargets;
1147-
m_executableTargets.clear();
1147+
m_sortedDrawables.clear();
11481148

11491149
for (auto target : m_targets) {
1150-
m_executableTargets.push_back(target.get());
1150+
m_sortedDrawables.push_back(target.get());
11511151

11521152
// Set engine in the target
11531153
target->setEngine(this);
@@ -1160,8 +1160,8 @@ void Engine::setTargets(const std::vector<std::shared_ptr<Target>> &newTargets)
11601160
}
11611161
}
11621162

1163-
// Sort the executable targets by layer order
1164-
std::sort(m_executableTargets.begin(), m_executableTargets.end(), [](Target *t1, Target *t2) { return t1->layerOrder() < t2->layerOrder(); });
1163+
// Sort the drawables by layer order
1164+
std::sort(m_sortedDrawables.begin(), m_sortedDrawables.end(), [](Drawable *d1, Drawable *d2) { return d1->layerOrder() < d2->layerOrder(); });
11651165
}
11661166

11671167
Target *Engine::targetAt(int index) const
@@ -1213,27 +1213,27 @@ int Engine::findTarget(const std::string &targetName) const
12131213

12141214
void Engine::moveSpriteToFront(Sprite *sprite)
12151215
{
1216-
if (!sprite || m_executableTargets.size() <= 2)
1216+
if (!sprite || m_sortedDrawables.size() <= 2)
12171217
return;
12181218

1219-
auto it = std::find(m_executableTargets.begin(), m_executableTargets.end(), sprite);
1219+
auto it = std::find(m_sortedDrawables.begin(), m_sortedDrawables.end(), sprite);
12201220

1221-
if (it != m_executableTargets.end()) {
1222-
std::rotate(it, it + 1, m_executableTargets.end());
1223-
updateSpriteLayerOrder();
1221+
if (it != m_sortedDrawables.end()) {
1222+
std::rotate(it, it + 1, m_sortedDrawables.end());
1223+
updateDrawableLayerOrder();
12241224
}
12251225
}
12261226

12271227
void Engine::moveSpriteToBack(Sprite *sprite)
12281228
{
1229-
if (!sprite || m_executableTargets.size() <= 2)
1229+
if (!sprite || m_sortedDrawables.size() <= 2)
12301230
return;
12311231

1232-
auto it = std::find(m_executableTargets.begin(), m_executableTargets.end(), sprite);
1232+
auto it = std::find(m_sortedDrawables.begin(), m_sortedDrawables.end(), sprite);
12331233

1234-
if (it != m_executableTargets.end()) {
1235-
std::rotate(m_executableTargets.begin() + 1, it, it + 1); // stage is always the first
1236-
updateSpriteLayerOrder();
1234+
if (it != m_sortedDrawables.end()) {
1235+
std::rotate(m_sortedDrawables.begin() + 1, it, it + 1); // stage is always the first
1236+
updateDrawableLayerOrder();
12371237
}
12381238
}
12391239

@@ -1242,19 +1242,19 @@ void Engine::moveSpriteForwardLayers(Sprite *sprite, int layers)
12421242
if (!sprite || layers == 0)
12431243
return;
12441244

1245-
auto it = std::find(m_executableTargets.begin(), m_executableTargets.end(), sprite);
1245+
auto it = std::find(m_sortedDrawables.begin(), m_sortedDrawables.end(), sprite);
12461246

1247-
if (it == m_executableTargets.end())
1247+
if (it == m_sortedDrawables.end())
12481248
return;
12491249

12501250
auto target = it + layers;
12511251

1252-
if (target <= m_executableTargets.begin()) {
1252+
if (target <= m_sortedDrawables.begin()) {
12531253
moveSpriteToBack(sprite);
12541254
return;
12551255
}
12561256

1257-
if (target >= m_executableTargets.end()) {
1257+
if (target >= m_sortedDrawables.end()) {
12581258
moveSpriteToFront(sprite);
12591259
return;
12601260
}
@@ -1264,7 +1264,7 @@ void Engine::moveSpriteForwardLayers(Sprite *sprite, int layers)
12641264
else
12651265
std::rotate(target, it, it + 1);
12661266

1267-
updateSpriteLayerOrder();
1267+
updateDrawableLayerOrder();
12681268
}
12691269

12701270
void Engine::moveSpriteBackwardLayers(Sprite *sprite, int layers)
@@ -1277,23 +1277,23 @@ void Engine::moveSpriteBehindOther(Sprite *sprite, Sprite *other)
12771277
if (sprite == other)
12781278
return;
12791279

1280-
auto itSprite = std::find(m_executableTargets.begin(), m_executableTargets.end(), sprite);
1281-
auto itOther = std::find(m_executableTargets.begin(), m_executableTargets.end(), other);
1280+
auto itSprite = std::find(m_sortedDrawables.begin(), m_sortedDrawables.end(), sprite);
1281+
auto itOther = std::find(m_sortedDrawables.begin(), m_sortedDrawables.end(), other);
12821282

1283-
if ((itSprite == m_executableTargets.end()) || (itOther == m_executableTargets.end()))
1283+
if ((itSprite == m_sortedDrawables.end()) || (itOther == m_sortedDrawables.end()))
12841284
return;
12851285

12861286
auto target = itOther - 1; // behind
12871287

12881288
if (target < itSprite)
12891289
target++;
12901290

1291-
if (target <= m_executableTargets.begin()) {
1291+
if (target <= m_sortedDrawables.begin()) {
12921292
moveSpriteToBack(sprite);
12931293
return;
12941294
}
12951295

1296-
if (target >= m_executableTargets.end()) {
1296+
if (target >= m_sortedDrawables.end()) {
12971297
moveSpriteToFront(sprite);
12981298
return;
12991299
}
@@ -1303,7 +1303,7 @@ void Engine::moveSpriteBehindOther(Sprite *sprite, Sprite *other)
13031303
else
13041304
std::rotate(target, itSprite, itSprite + 1);
13051305

1306-
updateSpriteLayerOrder();
1306+
updateDrawableLayerOrder();
13071307
}
13081308

13091309
Stage *Engine::stage() const
@@ -1666,12 +1666,12 @@ const std::vector<Script *> &Engine::getHats(Target *target, HatType type)
16661666
}
16671667
}
16681668

1669-
void Engine::updateSpriteLayerOrder()
1669+
void Engine::updateDrawableLayerOrder()
16701670
{
1671-
assert(m_executableTargets.empty() || m_executableTargets[0]->isStage());
1671+
assert(m_sortedDrawables.empty() || (m_sortedDrawables[0]->isTarget() && static_cast<Target *>(m_sortedDrawables[0])->isStage()));
16721672

1673-
for (size_t i = 1; i < m_executableTargets.size(); i++) // i = 1 to skip the stage
1674-
m_executableTargets[i]->setLayerOrder(i);
1673+
for (size_t i = 1; i < m_sortedDrawables.size(); i++) // i = 1 to skip the stage
1674+
m_sortedDrawables[i]->setLayerOrder(i);
16751675
}
16761676

16771677
const std::string &Engine::userAgent() const
@@ -1914,7 +1914,7 @@ void Engine::removeExecutableClones()
19141914
{
19151915
// Remove clones from the executable targets
19161916
for (std::shared_ptr<Sprite> clone : m_clones)
1917-
m_executableTargets.erase(std::remove(m_executableTargets.begin(), m_executableTargets.end(), clone.get()), m_executableTargets.end());
1917+
m_sortedDrawables.erase(std::remove(m_sortedDrawables.begin(), m_sortedDrawables.end(), clone.get()), m_sortedDrawables.end());
19181918
}
19191919

19201920
void Engine::addVarOrListMonitor(std::shared_ptr<Monitor> monitor, Target *target)
@@ -2021,23 +2021,27 @@ template<typename F>
20212021
void Engine::allScriptsByOpcodeDo(HatType hatType, F &&f, Target *optTarget)
20222022
{
20232023
// https://github.com/scratchfoundation/scratch-vm/blob/f1aa92fad79af17d9dd1c41eeeadca099339a9f1/src/engine/runtime.js#L1797-L1809
2024-
std::vector<Target *> *targetsPtr = &m_executableTargets;
2024+
std::vector<Drawable *> *drawablesPtr = &m_sortedDrawables;
20252025

20262026
if (optTarget)
2027-
targetsPtr = new std::vector<Target *>({ optTarget });
2027+
drawablesPtr = new std::vector<Drawable *>({ optTarget });
20282028

2029-
const std::vector<Target *> targets = *targetsPtr;
2029+
const std::vector<Drawable *> &drawables = *drawablesPtr;
20302030

2031-
for (int t = targets.size() - 1; t >= 0; t--) {
2032-
Target *target = targets[t];
2033-
const auto &scripts = getHats(target, hatType);
2031+
for (int t = drawables.size() - 1; t >= 0; t--) {
2032+
Drawable *drawable = drawables[t];
20342033

2035-
for (size_t j = 0; j < scripts.size(); j++)
2036-
f(scripts[j], target);
2034+
if (drawable->isTarget()) {
2035+
Target *target = static_cast<Target *>(drawable);
2036+
const auto &scripts = getHats(target, hatType);
2037+
2038+
for (size_t j = 0; j < scripts.size(); j++)
2039+
f(scripts[j], target);
2040+
}
20372041
}
20382042

20392043
if (optTarget)
2040-
delete targetsPtr;
2044+
delete drawablesPtr;
20412045
}
20422046

20432047
std::vector<std::shared_ptr<Thread>> Engine::startHats(HatType hatType, const std::unordered_map<HatField, std::variant<std::string, const char *, Entity *>> &optMatchFields, Target *optTarget)

src/engine/internal/engine.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,7 @@ class Engine : public IEngine
218218
void addHatField(Script *script, HatField hatField, Field *targetField);
219219
const std::vector<libscratchcpp::Script *> &getHats(Target *target, HatType type);
220220

221-
void updateSpriteLayerOrder();
221+
void updateDrawableLayerOrder();
222222

223223
void updateFrameDuration();
224224
void addRunningScript(std::shared_ptr<Thread> thread);
@@ -244,7 +244,7 @@ class Engine : public IEngine
244244
std::unordered_map<Broadcast *, Thread *> m_broadcastSenders; // used for resolving broadcast promises
245245
std::vector<std::shared_ptr<Monitor>> m_monitors;
246246
std::vector<std::string> m_extensions;
247-
std::vector<Target *> m_executableTargets; // sorted by layer (reverse order of execution)
247+
std::vector<Drawable *> m_sortedDrawables; // sorted by layer (reverse order of execution)
248248
std::vector<std::shared_ptr<Thread>> m_threads;
249249
std::vector<std::shared_ptr<Thread>> m_threadsToStop;
250250
std::shared_ptr<Thread> m_activeThread;

0 commit comments

Comments
 (0)