Browse Source

Clean up ParticleEmitter API. Removed resetPeriod option from SetEmitting(), instead the period is always reset if the state changes. Added separate RemoveAllParticles(), ResetEmissionTimer() & Reset() functions.

Lasse Öörni 11 years ago
parent
commit
766a08060d

+ 22 - 2
Source/Engine/Graphics/ParticleEmitter.cpp

@@ -619,9 +619,9 @@ void ParticleEmitter::SetInactiveTime(float time)
     MarkNetworkUpdate();
 }
 
-void ParticleEmitter::SetEmitting(bool enable, bool resetPeriod)
+void ParticleEmitter::SetEmitting(bool enable)
 {
-    if (enable != emitting_ || resetPeriod)
+    if (enable != emitting_)
     {
         emitting_ = enable;
         periodTimer_ = 0.0f;
@@ -794,6 +794,26 @@ void ParticleEmitter::SetNumTextureFrames(unsigned num)
     textureFrames_.Resize(num);
 }
 
+void ParticleEmitter::ResetEmissionTimer()
+{
+    emissionTimer_ = 0.0f;
+}
+
+void ParticleEmitter::RemoveAllParticles()
+{
+    for (PODVector<Billboard>::Iterator i = billboards_.Begin(); i != billboards_.End(); ++i)
+        i->enabled_ = false;
+    
+    Commit();
+}
+
+void ParticleEmitter::Reset()
+{
+    RemoveAllParticles();
+    ResetEmissionTimer();
+    SetEmitting(true);
+}
+
 void ParticleEmitter::SetParticlesAttr(VariantVector value)
 {
     unsigned index = 0;

+ 8 - 2
Source/Engine/Graphics/ParticleEmitter.h

@@ -154,8 +154,8 @@ public:
     void SetActiveTime(float time);
     /// Set emission inactive period length (0 = infinite.)
     void SetInactiveTime(float time);
-    /// Set whether should be emitting and optionally reset emission period.
-    void SetEmitting(bool enable, bool resetPeriod = false);
+    /// Set whether should be emitting. If the state was changed, also resets the emission period timer.
+    void SetEmitting(bool enable);
     /// Set whether to update when particles are not visible.
     void SetUpdateInvisible(bool enable);
     /// Set particle time to live (both minimum and maximum.)
@@ -210,6 +210,12 @@ public:
     void SetTextureFrames(const Vector<TextureFrame>& animation);
     /// Set number of texture animation frames.
     void SetNumTextureFrames(unsigned num);
+    /// Reset the emission period timer.
+    void ResetEmissionTimer();
+    /// Remove all current particles.
+    void RemoveAllParticles();
+    /// Reset the particle emitter completely. Removes current particles, sets emitting state on, and resets the emission timer.
+    void Reset();
     
     /// Return maximum number of particles.
     unsigned GetNumParticles() const { return particles_.Size(); }

+ 4 - 1
Source/Engine/LuaScript/pkgs/Graphics/ParticleEmitter.pkg

@@ -53,7 +53,7 @@ class ParticleEmitter : public BillboardSet
     void SetEmitterSize(const Vector3& size);
     void SetActiveTime(float time);
     void SetInactiveTime(float time);
-    void SetEmitting(bool enable, bool resetPeriod = false);
+    void SetEmitting(bool enable);
     void SetUpdateInvisible(bool enable);
     void SetTimeToLive(float time);
     void SetMinTimeToLive(float time);
@@ -79,6 +79,9 @@ class ParticleEmitter : public BillboardSet
     void SetColor(const Color& color);
     void SetNumColors(unsigned num);
     void SetNumTextureFrames(unsigned num);
+    void ResetEmissionTimer();
+    void RemoveAllParticles();
+    void Reset();
     
     unsigned GetNumParticles() const;
     bool IsEmitting() const;

+ 4 - 7
Source/Engine/Script/GraphicsAPI.cpp

@@ -1026,11 +1026,6 @@ static void RegisterBillboardSet(asIScriptEngine* engine)
     engine->RegisterObjectMethod("BillboardSet", "Zone@+ get_zone() const", asMETHOD(BillboardSet, GetZone), asCALL_THISCALL);
 }
 
-void ParticleEmitterSetEmitting(bool enable, ParticleEmitter* ptr)
-{
-    ptr->SetEmitting(enable);
-}
-
 static void RegisterParticleEmitter(asIScriptEngine* engine)
 {
     engine->RegisterEnum("EmitterType");
@@ -1052,8 +1047,10 @@ static void RegisterParticleEmitter(asIScriptEngine* engine)
     RegisterDrawable<ParticleEmitter>(engine, "ParticleEmitter");
     engine->RegisterObjectMethod("ParticleEmitter", "bool Load(XMLFile@+)", asMETHODPR(ParticleEmitter, Load, (XMLFile*), bool), asCALL_THISCALL);
     engine->RegisterObjectMethod("ParticleEmitter", "bool Save(XMLFile@+)", asMETHODPR(ParticleEmitter, Save, (XMLFile*) const, bool), asCALL_THISCALL);
-    engine->RegisterObjectMethod("ParticleEmitter", "void SetEmitting(bool, bool)", asMETHOD(ParticleEmitter, SetEmitting), asCALL_THISCALL);
     engine->RegisterObjectMethod("ParticleEmitter", "void SetColor(const Color&in)", asMETHOD(ParticleEmitter, SetColor), asCALL_THISCALL);
+    engine->RegisterObjectMethod("ParticleEmitter", "void ResetEmissionTimer()", asMETHOD(ParticleEmitter, ResetEmissionTimer), asCALL_THISCALL);
+    engine->RegisterObjectMethod("ParticleEmitter", "void RemoveAllParticles()", asMETHOD(ParticleEmitter, RemoveAllParticles), asCALL_THISCALL);
+    engine->RegisterObjectMethod("ParticleEmitter", "void Reset()", asMETHOD(ParticleEmitter, Reset), asCALL_THISCALL);
     engine->RegisterObjectMethod("ParticleEmitter", "void set_material(Material@+)", asMETHOD(ParticleEmitter, SetMaterial), asCALL_THISCALL);
     engine->RegisterObjectMethod("ParticleEmitter", "Material@+ get_material() const", asMETHOD(ParticleEmitter, GetMaterial), asCALL_THISCALL);
     engine->RegisterObjectMethod("ParticleEmitter", "void set_relative(bool)", asMETHOD(ParticleEmitter, SetRelative), asCALL_THISCALL);
@@ -1068,7 +1065,7 @@ static void RegisterParticleEmitter(asIScriptEngine* engine)
     engine->RegisterObjectMethod("ParticleEmitter", "bool get_updateInvisible() const", asMETHOD(ParticleEmitter, GetUpdateInvisible), asCALL_THISCALL);
     engine->RegisterObjectMethod("ParticleEmitter", "void set_animationLodBias(float)", asMETHOD(ParticleEmitter, SetAnimationLodBias), asCALL_THISCALL);
     engine->RegisterObjectMethod("ParticleEmitter", "float get_animationLodBias() const", asMETHOD(ParticleEmitter, GetAnimationLodBias), asCALL_THISCALL);
-    engine->RegisterObjectMethod("ParticleEmitter", "void set_emitting() const", asFUNCTION(ParticleEmitterSetEmitting), asCALL_CDECL_OBJLAST);
+    engine->RegisterObjectMethod("ParticleEmitter", "void set_emitting() const", asMETHOD(ParticleEmitter, SetEmitting), asCALL_THISCALL);
     engine->RegisterObjectMethod("ParticleEmitter", "bool get_emitting() const", asMETHOD(ParticleEmitter, IsEmitting), asCALL_THISCALL);
     engine->RegisterObjectMethod("ParticleEmitter", "void set_numParticles(uint) const", asMETHOD(ParticleEmitter, SetNumParticles), asCALL_THISCALL);
     engine->RegisterObjectMethod("ParticleEmitter", "uint get_numParticles() const", asMETHOD(ParticleEmitter, GetNumParticles), asCALL_THISCALL);