From 1c1fb4fdcb97817c227cd0f5e6adb751efad96bd Mon Sep 17 00:00:00 2001 From: David Rose Date: Mon, 9 Sep 2002 17:13:52 +0000 Subject: [PATCH] rationalize particle cleanup a bit --- direct/src/interval/ParticleInterval.py | 31 ++++++++++++++++++------- direct/src/particles/ForceGroup.py | 5 ++-- direct/src/particles/ParticleEffect.py | 11 ++++----- direct/src/particles/Particles.py | 6 ++--- 4 files changed, 31 insertions(+), 22 deletions(-) diff --git a/direct/src/interval/ParticleInterval.py b/direct/src/interval/ParticleInterval.py index cbf7fe9621..e7112443e8 100644 --- a/direct/src/interval/ParticleInterval.py +++ b/direct/src/interval/ParticleInterval.py @@ -28,30 +28,43 @@ class ParticleInterval(Interval.Interval): assert(duration > 0.0 or loop == 1) # Initialize superclass 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): renderParent = None if self.worldRelative: renderParent = render - self.particleEffect.start(self.parent, renderParent) + if self.particleEffect: + self.particleEffect.start(self.parent, renderParent) self.state = CInterval.SStarted self.currT = t def privStep(self, t): if self.state == CInterval.SPaused: # 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): - 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.state = CInterval.SFinal def privInterrupt(self): - self.particleEffect.cleanup() - self.cleanedUp = 1 + self.particleEffect.disable() self.state = CInterval.SPaused diff --git a/direct/src/particles/ForceGroup.py b/direct/src/particles/ForceGroup.py index 0e929d4e14..97e41c74b2 100644 --- a/direct/src/particles/ForceGroup.py +++ b/direct/src/particles/ForceGroup.py @@ -21,7 +21,7 @@ class ForceGroup(DirectObject): self.name = name self.node = ForceNode.ForceNode(self.name) - self.nodePath = hidden.attachNewNode(self.node) + self.nodePath = NodePath(self.node) self.fEnabled = 0 self.particleEffect = None @@ -29,8 +29,7 @@ class ForceGroup(DirectObject): def cleanup(self): for f in self.asList(): self.removeForce(f) - self.nodePath.removeNode() - self.node = None + self.nodePath.detachNode() self.particleEffect = None def enable(self): diff --git a/direct/src/particles/ParticleEffect.py b/direct/src/particles/ParticleEffect.py index 824d6f027a..4ac21acb94 100644 --- a/direct/src/particles/ParticleEffect.py +++ b/direct/src/particles/ParticleEffect.py @@ -10,11 +10,10 @@ class ParticleEffect(NodePath): def __init__(self, name=None, particles=None): """__init__()""" - NodePath.__init__(self) if (name == None): name = 'particle-effect-%d' % ParticleEffect.pid ParticleEffect.pid += 1 - self.assign(hidden.attachNewNode(name)) + NodePath.__init__(self, name) # Record particle effect name self.name = name # Enabled flag @@ -35,15 +34,12 @@ class ParticleEffect(NodePath): self.reparentTo(parent) def cleanup(self): - self.reparentTo(hidden) + self.detachNode() self.disable() for f in self.forceGroupDict.values(): f.cleanup() for p in self.particlesDict.values(): p.cleanup() - forceGroupDict = {} - particlesDict = {} - self.removeNode() def reset(self): self.removeAllForces() @@ -64,6 +60,7 @@ class ParticleEffect(NodePath): def disable(self): """disable()""" + self.detachNode() for p in self.particlesDict.values(): p.setRenderParent(p.node) for f in self.forceGroupDict.values(): @@ -100,7 +97,7 @@ class ParticleEffect(NodePath): for f in forceGroup.asList(): self.removeForce(f) - forceGroup.nodePath.reparentTo(hidden) + forceGroup.nodePath.detachNode() forceGroup.particleEffect = None del self.forceGroupDict[forceGroup.getName()] diff --git a/direct/src/particles/Particles.py b/direct/src/particles/Particles.py index 390920f71c..9873f7ba8d 100644 --- a/direct/src/particles/Particles.py +++ b/direct/src/particles/Particles.py @@ -48,7 +48,7 @@ class Particles(ParticleSystem.ParticleSystem): # Set up a physical node self.node = PhysicalNode(self.name) - self.nodePath = hidden.attachNewNode(self.node) + self.nodePath = NodePath(self.node) self.setRenderParent(self.node) self.node.addPhysical(self) @@ -72,7 +72,7 @@ class Particles(ParticleSystem.ParticleSystem): self.clearAngularForces() self.setRenderParent(self.node) self.node.removePhysical(self) - self.nodePath.removeNode() + self.nodePath.detachNode() self.node = None self.factory = None self.renderer = None @@ -131,7 +131,7 @@ class Particles(ParticleSystem.ParticleSystem): self.renderer = LineParticleRenderer.LineParticleRenderer() elif (type == "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 # the direct tools with toontown. import DirectSelection