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)
# 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

View File

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

View File

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

View File

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