Browse Source

Make sure to send the particle effect finish event in the main thread.

Lasse Öörni 10 years ago
parent
commit
11856fd7be
1 changed files with 28 additions and 31 deletions
  1. 28 31
      Source/Urho3D/Graphics/ParticleEmitter.cpp

+ 28 - 31
Source/Urho3D/Graphics/ParticleEmitter.cpp

@@ -163,37 +163,6 @@ void ParticleEmitter::Update(const FrameInfo& frame)
                 break;
                 break;
         }
         }
     }
     }
-    else if (sendFinishEvent_)
-    {
-        // Send finished event only once all billboards are gone
-        bool hasEnabledBillboards = false;
-
-        for (unsigned i = 0; i < billboards_.Size(); ++i)
-        {
-            if (billboards_[i].enabled_)
-            {
-                hasEnabledBillboards = true;
-                break;
-            }
-        }
-
-        if (!hasEnabledBillboards)
-        {
-            sendFinishEvent_ = false;
-
-            using namespace ParticleEffectFinished;
-
-            WeakPtr<ParticleEmitter> self(this);
-            VariantMap& eventData = GetEventDataMap();
-            eventData[P_NODE] = node_;
-            eventData[P_EFFECT] = effect_;
-
-            // Note: this may cause deletion of self
-            node_->SendEvent(E_PARTICLEEFFECTFINISHED, eventData);
-            if (self.Expired())
-                return;
-        }
-    }
 
 
     // Update existing particles
     // Update existing particles
     Vector3 relativeConstantForce = node_->GetWorldRotation().Inverse() * effect_->GetConstantForce();
     Vector3 relativeConstantForce = node_->GetWorldRotation().Inverse() * effect_->GetConstantForce();
@@ -559,6 +528,34 @@ void ParticleEmitter::HandleScenePostUpdate(StringHash eventType, VariantMap& ev
         needUpdate_ = true;
         needUpdate_ = true;
         MarkForUpdate();
         MarkForUpdate();
     }
     }
+
+    if (node_ && !emitting_ && sendFinishEvent_)
+    {
+        // Send finished event only once all billboards are gone
+        bool hasEnabledBillboards = false;
+
+        for (unsigned i = 0; i < billboards_.Size(); ++i)
+        {
+            if (billboards_[i].enabled_)
+            {
+                hasEnabledBillboards = true;
+                break;
+            }
+        }
+
+        if (!hasEnabledBillboards)
+        {
+            sendFinishEvent_ = false;
+
+            using namespace ParticleEffectFinished;
+
+            VariantMap& eventData = GetEventDataMap();
+            eventData[P_NODE] = node_;
+            eventData[P_EFFECT] = effect_;
+
+            node_->SendEvent(E_PARTICLEEFFECTFINISHED, eventData);
+        }
+    }
 }
 }
 
 
 void ParticleEmitter::HandleEffectReloadFinished(StringHash eventType, VariantMap& eventData)
 void ParticleEmitter::HandleEffectReloadFinished(StringHash eventType, VariantMap& eventData)