瀏覽代碼

replacing particleEffect.cleanup() with particleEffect.disable() in ParticleInterval.cleanup(). This should allow us to reuse pooled effects in subsequent different particle intervals. Also, printing a more helpful error message when trying to use an already cleaned up ParticleEffect

Josh Wilson 17 年之前
父節點
當前提交
9fcac8b39c
共有 2 個文件被更改,包括 18 次插入10 次删除
  1. 1 1
      direct/src/interval/ParticleInterval.py
  2. 17 9
      direct/src/particles/ParticleEffect.py

+ 1 - 1
direct/src/interval/ParticleInterval.py

@@ -136,6 +136,6 @@ class ParticleInterval(Interval):
     def privFinalize(self):
         Interval.privFinalize(self)
         if self.cleanup and self.particleEffect:
-            self.particleEffect.cleanup()
+            self.particleEffect.disable()
             self.particleEffect = None
             

+ 17 - 9
direct/src/particles/ParticleEffect.py

@@ -28,13 +28,12 @@ class ParticleEffect(NodePath):
     def cleanup(self):
         self.removeNode()
         self.disable()
-        if hasattr(self, 'forceGroupDict'):
+        if self.__isValid():
             for f in self.forceGroupDict.values():
                 f.cleanup()
-            del self.forceGroupDict
-        if hasattr(self, 'particlesDict'):
             for p in self.particlesDict.values():
                 p.cleanup()
+            del self.forceGroupDict
             del self.particlesDict
         del self.renderParent
 
@@ -53,7 +52,7 @@ class ParticleEffect(NodePath):
 
     def enable(self):
         # band-aid added for client crash - grw
-        if hasattr(self, 'forceGroupDict') and hasattr(self, 'particlesDict'):
+        if self.__isValid():
             if (self.renderParent != None):
                 for p in self.particlesDict.values():
                     p.setRenderParent(self.renderParent.node())
@@ -66,7 +65,7 @@ class ParticleEffect(NodePath):
     def disable(self):
         self.detachNode()
         # band-aid added for client crash - grw
-        if hasattr(self, 'forceGroupDict') and hasattr(self, 'particlesDict'):
+        if self.__isValid():
             for p in self.particlesDict.values():
                 p.setRenderParent(p.node)
             for f in self.forceGroupDict.values():
@@ -101,7 +100,7 @@ class ParticleEffect(NodePath):
 
         forceGroup.nodePath.removeNode()
         forceGroup.particleEffect = None
-        del self.forceGroupDict[forceGroup.getName()]
+        self.forceGroupDict.pop(forceGroup.getName(), None)
 
     def removeForce(self, force):
         for p in self.particlesDict.values():
@@ -125,7 +124,7 @@ class ParticleEffect(NodePath):
             self.notify.warning('removeParticles() - particles == None!')
             return
         particles.nodePath.detachNode()
-        del self.particlesDict[particles.getName()]
+        self.particlesDict.pop(particles.getName(), None)
 
         # Remove all forces from the particles
         for fg in self.forceGroupDict.values():
@@ -216,5 +215,14 @@ class ParticleEffect(NodePath):
             particles.softStop()
 
     def softStart(self):
-        for particles in self.getParticlesList():
-            particles.softStart()
+        if self.__isValid():
+            for particles in self.getParticlesList():
+                particles.softStart()
+        else:
+            # Not asserting here since we want to crash live clients for more expedient bugfix
+            # (Sorry, live clients)
+            self.notify.error('Trying to start effect(%s) after cleanup.' % (self.getName(),))
+
+    def __isValid(self):
+        return hasattr(self, 'forceGroupDict') and \
+               hasattr(self, 'particlesDict')