@@ -28,14 +28,17 @@ namespace MWRender
2828 }
2929
3030 void EffectManager::addEffect (VFS::Path::NormalizedView model, std::string_view textureOverride,
31- const osg::Vec3f& worldPosition, float scale, bool isMagicVFX, bool useAmbientLight)
31+ const osg::Vec3f& worldPosition, float scale, bool isMagicVFX, bool useAmbientLight, std::string_view effectId,
32+ bool loop)
3233 {
3334 osg::ref_ptr<osg::Node> node = mResourceSystem ->getSceneManager ()->getInstance (model);
3435
3536 node->setNodeMask (Mask_Effect);
3637
3738 Effect effect;
3839 effect.mAnimTime = std::make_shared<EffectAnimationTime>();
40+ effect.mLoop = loop;
41+ effect.mEffectId = effectId;
3942
4043 SceneUtil::FindMaxControllerLengthVisitor findMaxLengthVisitor;
4144 node->accept (findMaxLengthVisitor);
@@ -70,14 +73,41 @@ namespace MWRender
7073 mEffects .push_back (std::move (effect));
7174 }
7275
76+ void EffectManager::removeEffect (std::string_view effectId)
77+ {
78+ mEffects .erase (std::remove_if (mEffects .begin (), mEffects .end (),
79+ [effectId, this ](Effect& effect) {
80+ if (effectId == effect.mEffectId )
81+ {
82+ mParentNode ->removeChild (effect.mTransform );
83+ return true ;
84+ }
85+
86+ return false ;
87+ }),
88+ mEffects .end ());
89+ }
90+
7391 void EffectManager::update (float dt)
7492 {
7593 mEffects .erase (std::remove_if (mEffects .begin (), mEffects .end (),
7694 [dt, this ](Effect& effect) {
95+ bool remove = false ;
7796 effect.mAnimTime ->addTime (dt);
78- const auto remove = effect.mAnimTime ->getTime () >= effect.mMaxControllerLength ;
79- if (remove)
80- mParentNode ->removeChild (effect.mTransform );
97+ if (effect.mAnimTime ->getTime () >= effect.mMaxControllerLength )
98+ {
99+ if (effect.mLoop )
100+ {
101+ float remainder = effect.mAnimTime ->getTime () - effect.mMaxControllerLength ;
102+ effect.mAnimTime ->resetTime (remainder);
103+ }
104+ else
105+ {
106+ mParentNode ->removeChild (effect.mTransform );
107+ remove = true ;
108+ }
109+ }
110+
81111 return remove;
82112 }),
83113 mEffects .end ());
0 commit comments