diff --git a/direct/src/particles/ForceGroup.py b/direct/src/particles/ForceGroup.py index 559543a1dc..60b37a26a0 100644 --- a/direct/src/particles/ForceGroup.py +++ b/direct/src/particles/ForceGroup.py @@ -10,7 +10,7 @@ class ForceGroup(DirectObject): notify = DirectNotifyGlobal.directNotify.newCategory('ForceGroup') id = 1 - def __init__(self, name = None): + def __init__(self, name=None): """__init__(self)""" if (name == None): @@ -24,12 +24,10 @@ class ForceGroup(DirectObject): self.fEnabled = 0 self.particleEffect = None - - # Default to enabled - #self.enable() def cleanup(self): - self.disable() + for f in self.asList(): + self.removeForce(f) self.nodePath.removeNode() self.node = None self.particleEffect = None @@ -62,7 +60,7 @@ class ForceGroup(DirectObject): def removeForce(self, force): """removeForce(self, force)""" self.node.removeForce(force) - if (self.particleEffect): + if (self.particleEffect != None): self.particleEffect.removeForce(force) # Get/set diff --git a/direct/src/particles/ParticleEffect.py b/direct/src/particles/ParticleEffect.py index f94281ebf9..70a5ade9eb 100644 --- a/direct/src/particles/ParticleEffect.py +++ b/direct/src/particles/ParticleEffect.py @@ -37,6 +37,12 @@ class ParticleEffect(NodePath): particlesDict = {} self.removeNode() + def reset(self): + self.removeAllForces() + self.removeAllParticles() + self.forceGroupDict = {} + self.particlesDict = {} + def enable(self): """enable()""" for f in self.forceGroupDict.values(): @@ -67,7 +73,7 @@ class ParticleEffect(NodePath): self.forceGroupDict[forceGroup.getName()] = forceGroup # Associate the force group with all particles - for f in forceGroup: + for f in forceGroup.asList(): self.addForce(f) def addForce(self, force): @@ -77,19 +83,23 @@ class ParticleEffect(NodePath): def removeForceGroup(self, forceGroup): """removeForceGroup(forceGroup)""" + # Remove forces from all particles + for f in forceGroup.asList(): + self.removeForce(f) + forceGroup.nodePath.reparentTo(hidden) forceGroup.particleEffect = None - self.forceGroupDict[forceGroup.getName()] = None - - # Remove forces from all particles - for f in forceGroup: - self.removeForce(f) + del self.forceGroupDict[forceGroup.getName()] def removeForce(self, force): """removeForce(force)""" for p in self.particlesDict.values(): p.removeForce(force) + def removeAllForces(self): + for fg in self.forceGroupDict.values(): + self.removeForceGroup(fg) + def addParticles(self, particles): """addParticles(particles)""" particles.nodePath.reparentTo(self) @@ -97,19 +107,26 @@ class ParticleEffect(NodePath): # Associate all forces in all force groups with the particles for fg in self.forceGroupDict.values(): - for f in fg: + for f in fg.asList(): particles.addForce(f) def removeParticles(self, particles): """removeParticles(particles)""" + if (particles == None): + self.notify.warning('removeParticles() - particles == None!') + return particles.nodePath.reparentTo(hidden) - self.particlesDict[particles.getName()] = None + del self.particlesDict[particles.getName()] # Remove all forces from the particles for fg in self.forceGroupDict.values(): - for f in fg: + for f in fg.asList(): particles.removeForce(f) + def removeAllParticles(self): + for p in self.particlesDict.values(): + self.removeParticles(p) + def getParticlesList(self): """getParticles()""" return self.particlesDict.values() @@ -141,12 +158,7 @@ class ParticleEffect(NodePath): f.write('\n') # Make sure we start with a clean slate - f.write('for p in self.getParticlesList():\n') - f.write('\tself.removeParticles(p)\n') - f.write('for fg in self.getForceGroupList():\n') - f.write('\tself.removeForceGroup(fg)\n') - f.write('self.particlesDict = {}\n') - f.write('self.forceGroupDict = {}\n') + f.write('self.reset()\n') pos = self.getPos() hpr = self.getHpr() diff --git a/direct/src/particles/Particles.py b/direct/src/particles/Particles.py index 068847f4b6..8a7ee790b4 100644 --- a/direct/src/particles/Particles.py +++ b/direct/src/particles/Particles.py @@ -71,6 +71,8 @@ class Particles(ParticleSystem.ParticleSystem): def cleanup(self): self.disable() + self.clearLinearForces() + self.clearAngularForces() self.setRenderParent(self.node) self.node.removePhysical(self) self.nodePath.removeNode() @@ -189,6 +191,9 @@ class Particles(ParticleSystem.ParticleSystem): def removeForce(self, force): """removeForce(force)""" + if (force == None): + self.notify.warning('removeForce() - force == None!') + return if (force.isLinear()): self.removeLinearForce(force) else: