rationalize particle cleanup a bit

This commit is contained in:
David Rose 2002-09-09 17:13:52 +00:00
parent 680ce82d3f
commit 1c1fb4fdcb
4 changed files with 31 additions and 22 deletions

View File

@ -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.privInitialize(t)
self.state = CInterval.SStarted else:
self.currT = t self.state = CInterval.SStarted
self.currT = t
def privFinalize(self): def privFinalize(self):
self.particleEffect.cleanup() if self.particleEffect:
self.cleanedUp = 1 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.particleEffect.disable()
self.cleanedUp = 1
self.state = CInterval.SPaused self.state = CInterval.SPaused

View File

@ -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.nodePath.detachNode()
self.node = None
self.particleEffect = None self.particleEffect = None
def enable(self): def enable(self):

View File

@ -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()]

View File

@ -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