@@ -53,7 +53,7 @@ Engine::Engine() :
5353Engine::~Engine ()
5454{
5555 m_clones.clear ();
56- m_executableTargets .clear ();
56+ m_sortedDrawables .clear ();
5757}
5858
5959void 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
448448void 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
454454void Engine::stopSounds ()
@@ -1144,10 +1144,10 @@ const std::vector<std::shared_ptr<Target>> &Engine::targets() const
11441144void 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
11671167Target *Engine::targetAt (int index) const
@@ -1213,27 +1213,27 @@ int Engine::findTarget(const std::string &targetName) const
12131213
12141214void 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
12271227void 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
12701270void 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
13091309Stage *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
16771677const std::string &Engine::userAgent () const
@@ -1912,9 +1912,9 @@ void Engine::deleteClones()
19121912
19131913void Engine::removeExecutableClones ()
19141914{
1915- // Remove clones from the executable targets
1915+ // Remove clones from sorted drawables
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
19201920void Engine::addVarOrListMonitor (std::shared_ptr<Monitor> monitor, Target *target)
@@ -2021,23 +2021,27 @@ template<typename F>
20212021void 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
20432047std::vector<std::shared_ptr<Thread>> Engine::startHats (HatType hatType, const std::unordered_map<HatField, std::variant<std::string, const char *, Entity *>> &optMatchFields, Target *optTarget)
0 commit comments