Browse Source

rationalize particle cleanup a bit

David Rose 23 years ago
parent
commit
1c1fb4fdcb

+ 22 - 9
direct/src/interval/ParticleInterval.py

@@ -28,30 +28,43 @@ class ParticleInterval(Interval.Interval):
         assert(duration > 0.0 or loop == 1)
         assert(duration > 0.0 or loop == 1)
         # Initialize superclass
         # Initialize superclass
         Interval.Interval.__init__(self, name, duration)
         Interval.Interval.__init__(self, name, duration)
-        self.cleanedUp = 0
+
+    def __del__(self):
+        if self.particleEffect:
+            self.particleEffect.cleanup()
+            self.particleEffect = None
 
 
     def privInitialize(self, t):
     def privInitialize(self, t):
         renderParent = None
         renderParent = None
         if self.worldRelative:
         if self.worldRelative:
             renderParent = render
             renderParent = render
-        self.particleEffect.start(self.parent, renderParent)
+        if self.particleEffect:
+            self.particleEffect.start(self.parent, renderParent)
         self.state = CInterval.SStarted
         self.state = CInterval.SStarted
         self.currT = t
         self.currT = t
 
 
     def privStep(self, t):
     def privStep(self, t):
         if self.state == CInterval.SPaused:
         if self.state == CInterval.SPaused:
             # Restarting from a pause.
             # Restarting from a pause.
-            self.particleEffect.start(self.parent, renderParent)
-        self.state = CInterval.SStarted
-        self.currT = t
+            self.privInitialize(t)
+        else:
+            self.state = CInterval.SStarted
+            self.currT = t
 
 
     def privFinalize(self):
     def privFinalize(self):
-        self.particleEffect.cleanup()
-        self.cleanedUp = 1
+        if self.particleEffect:
+            self.particleEffect.cleanup()
+            self.particleEffect = None
+        self.currT = self.getDuration()
+        self.state = CInterval.SFinal
+
+    def privInstant(self):
+        if self.particleEffect:
+            self.particleEffect.cleanup()
+            self.particleEffect = None
         self.currT = self.getDuration()
         self.currT = self.getDuration()
         self.state = CInterval.SFinal
         self.state = CInterval.SFinal
 
 
     def privInterrupt(self):
     def privInterrupt(self):
-        self.particleEffect.cleanup()
-        self.cleanedUp = 1
+        self.particleEffect.disable()
         self.state = CInterval.SPaused
         self.state = CInterval.SPaused

+ 2 - 3
direct/src/particles/ForceGroup.py

@@ -21,7 +21,7 @@ class ForceGroup(DirectObject):
             self.name = name
             self.name = name
 
 
         self.node = ForceNode.ForceNode(self.name)
         self.node = ForceNode.ForceNode(self.name)
-        self.nodePath = hidden.attachNewNode(self.node)
+        self.nodePath = NodePath(self.node)
         self.fEnabled = 0
         self.fEnabled = 0
 
 
         self.particleEffect = None
         self.particleEffect = None
@@ -29,8 +29,7 @@ class ForceGroup(DirectObject):
     def cleanup(self):
     def cleanup(self):
         for f in self.asList():
         for f in self.asList():
             self.removeForce(f)
             self.removeForce(f)
-        self.nodePath.removeNode()
-        self.node = None
+        self.nodePath.detachNode()
         self.particleEffect = None
         self.particleEffect = None
 
 
     def enable(self):
     def enable(self):

+ 4 - 7
direct/src/particles/ParticleEffect.py

@@ -10,11 +10,10 @@ class ParticleEffect(NodePath):
 
 
     def __init__(self, name=None, particles=None):
     def __init__(self, name=None, particles=None):
         """__init__()"""
         """__init__()"""
-        NodePath.__init__(self)
         if (name == None):
         if (name == None):
             name = 'particle-effect-%d' % ParticleEffect.pid
             name = 'particle-effect-%d' % ParticleEffect.pid
             ParticleEffect.pid += 1
             ParticleEffect.pid += 1
-        self.assign(hidden.attachNewNode(name))
+        NodePath.__init__(self, name)
         # Record particle effect name
         # Record particle effect name
         self.name = name
         self.name = name
         # Enabled flag
         # Enabled flag
@@ -35,15 +34,12 @@ class ParticleEffect(NodePath):
             self.reparentTo(parent)
             self.reparentTo(parent)
 
 
     def cleanup(self):
     def cleanup(self):
-        self.reparentTo(hidden)
+        self.detachNode()
         self.disable()
         self.disable()
         for f in self.forceGroupDict.values():
         for f in self.forceGroupDict.values():
             f.cleanup()
             f.cleanup()
         for p in self.particlesDict.values():
         for p in self.particlesDict.values():
             p.cleanup()
             p.cleanup()
-        forceGroupDict = {}
-        particlesDict = {}
-        self.removeNode()
 
 
     def reset(self):
     def reset(self):
         self.removeAllForces()
         self.removeAllForces()
@@ -64,6 +60,7 @@ class ParticleEffect(NodePath):
 
 
     def disable(self):
     def disable(self):
         """disable()"""
         """disable()"""
+        self.detachNode()
         for p in self.particlesDict.values():
         for p in self.particlesDict.values():
             p.setRenderParent(p.node)
             p.setRenderParent(p.node)
         for f in self.forceGroupDict.values():
         for f in self.forceGroupDict.values():
@@ -100,7 +97,7 @@ class ParticleEffect(NodePath):
         for f in forceGroup.asList():
         for f in forceGroup.asList():
             self.removeForce(f)
             self.removeForce(f)
 
 
-        forceGroup.nodePath.reparentTo(hidden)
+        forceGroup.nodePath.detachNode()
         forceGroup.particleEffect = None
         forceGroup.particleEffect = None
         del self.forceGroupDict[forceGroup.getName()]
         del self.forceGroupDict[forceGroup.getName()]
 
 

+ 3 - 3
direct/src/particles/Particles.py

@@ -48,7 +48,7 @@ class Particles(ParticleSystem.ParticleSystem):
 
 
         # Set up a physical node
         # Set up a physical node
         self.node = PhysicalNode(self.name)
         self.node = PhysicalNode(self.name)
-        self.nodePath = hidden.attachNewNode(self.node)
+        self.nodePath = NodePath(self.node)
         self.setRenderParent(self.node)
         self.setRenderParent(self.node)
         self.node.addPhysical(self)
         self.node.addPhysical(self)
 
 
@@ -72,7 +72,7 @@ class Particles(ParticleSystem.ParticleSystem):
         self.clearAngularForces()
         self.clearAngularForces()
         self.setRenderParent(self.node)
         self.setRenderParent(self.node)
         self.node.removePhysical(self)
         self.node.removePhysical(self)
-        self.nodePath.removeNode()
+        self.nodePath.detachNode()
         self.node = None
         self.node = None
         self.factory = None
         self.factory = None
         self.renderer = None
         self.renderer = None
@@ -131,7 +131,7 @@ class Particles(ParticleSystem.ParticleSystem):
             self.renderer = LineParticleRenderer.LineParticleRenderer()
             self.renderer = LineParticleRenderer.LineParticleRenderer()
         elif (type == "GeomParticleRenderer"):
         elif (type == "GeomParticleRenderer"):
             self.renderer = GeomParticleRenderer.GeomParticleRenderer()
             self.renderer = GeomParticleRenderer.GeomParticleRenderer()
-            npath = hidden.attachNewNode('default-geom')
+            npath = NodePath('default-geom')
             # This was moved here because we do not want to download
             # This was moved here because we do not want to download
             # the direct tools with toontown.
             # the direct tools with toontown.
             import DirectSelection
             import DirectSelection