| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267 |
- from pandac.PandaModules import *
- import seParticles
- import seForceGroup
- from direct.directnotify import DirectNotifyGlobal
- class ParticleEffect(NodePath):
- notify = DirectNotifyGlobal.directNotify.newCategory('ParticleEffect')
- pid = 1
- def __init__(self, name=None, particles=None):
- """__init__()"""
- if (name == None):
- name = 'particle-effect-%d' % ParticleEffect.pid
- ParticleEffect.pid += 1
- NodePath.__init__(self, name)
- # Record particle effect name
- self.name = name
- # Enabled flag
- self.fEnabled = 0
- # Dictionary of particles and forceGroups
- self.particlesDict = {}
- self.forceGroupDict = {}
- # The effect's particle system
- if (particles != None):
- self.addParticles(particles)
- self.renderParent = None
- def start(self, parent=None, renderParent=None):
- assert(self.notify.debug('start() - name: %s' % self.name))
- self.renderParent = renderParent
- self.enable()
- if (parent != None):
- self.reparentTo(parent)
- def cleanup(self):
- self.removeNode()
- self.disable()
- for f in self.forceGroupDict.values():
- f.cleanup()
- for p in self.particlesDict.values():
- p.cleanup()
- del self.renderParent
- del self.particlesDict
- del self.forceGroupDict
- def reset(self):
- self.removeAllForces()
- self.removeAllParticles()
- self.forceGroupDict = {}
- self.particlesDict = {}
- def enable(self):
- """enable()"""
- if (self.renderParent != None):
- for p in self.particlesDict.values():
- p.setRenderParent(self.renderParent.node())
- for f in self.forceGroupDict.values():
- f.enable()
- for p in self.particlesDict.values():
- p.enable()
- self.fEnabled = 1
- def disable(self):
- """disable()"""
- self.detachNode()
- for p in self.particlesDict.values():
- p.setRenderParent(p.node)
- for f in self.forceGroupDict.values():
- f.disable()
- for p in self.particlesDict.values():
- p.disable()
- self.fEnabled = 0
- def isEnabled(self):
- """
- isEnabled()
- Note: this may be misleading if enable(),disable() not used
- """
- return self.fEnabled
- def addForceGroup(self, forceGroup):
- """addForceGroup(forceGroup)"""
- forceGroup.nodePath.reparentTo(self)
- forceGroup.particleEffect = self
- self.forceGroupDict[forceGroup.getName()] = forceGroup
- # Associate the force group with all particles
- for i in range(len(forceGroup)):
- self.addForce(forceGroup[i])
- def addForce(self, force):
- """addForce(force)"""
- for p in self.particlesDict.values():
- p.addForce(force)
- def removeForceGroup(self, forceGroup):
- """removeForceGroup(forceGroup)"""
- # Remove forces from all particles
- for i in range(len(forceGroup)):
- self.removeForce(forceGroup[i])
- forceGroup.nodePath.removeNode()
- forceGroup.particleEffect = None
- 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)
- self.particlesDict[particles.getName()] = particles
- # Associate all forces in all force groups with the particles
- for fg in self.forceGroupDict.values():
- for i in range(len(fg)):
- particles.addForce(fg[i])
- def removeParticles(self, particles):
- """removeParticles(particles)"""
- if (particles == None):
- self.notify.warning('removeParticles() - particles == None!')
- return
- particles.nodePath.detachNode()
- del self.particlesDict[particles.getName()]
- # Remove all forces from the particles
- for fg in self.forceGroupDict.values():
- 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()
-
- def getParticlesNamed(self, name):
- """getParticlesNamed(name)"""
- return self.particlesDict.get(name, None)
- def getParticlesDict(self):
- """getParticlesDict()"""
- return self.particlesDict
- def getForceGroupList(self):
- """getForceGroup()"""
- return self.forceGroupDict.values()
- def getForceGroupNamed(self, name):
- """getForceGroupNamed(name)"""
- return self.forceGroupDict.get(name, None)
- def getForceGroupDict(self):
- """getForceGroup()"""
- return self.forceGroupDict
- def saveConfig(self, filename):
- """saveFileData(filename)"""
- f = open(filename.toOsSpecific(), 'wb')
- # Add a blank line
- f.write('\n')
- # Make sure we start with a clean slate
- f.write('self.reset()\n')
- pos = self.getPos()
- hpr = self.getHpr()
- scale = self.getScale()
- f.write('self.setPos(%0.3f, %0.3f, %0.3f)\n' %
- (pos[0], pos[1], pos[2]))
- f.write('self.setHpr(%0.3f, %0.3f, %0.3f)\n' %
- (hpr[0], hpr[1], hpr[2]))
- f.write('self.setScale(%0.3f, %0.3f, %0.3f)\n' %
- (scale[0], scale[1], scale[2]))
- # Save all the particles to file
- num = 0
- for p in self.particlesDict.values():
- target = 'p%d' % num
- num = num + 1
- f.write(target + ' = Particles.Particles(\'%s\')\n' % p.getName())
- p.printParams(f, target)
- f.write('self.addParticles(%s)\n' % target)
- # Save all the forces to file
- num = 0
- for fg in self.forceGroupDict.values():
- target = 'f%d' % num
- num = num + 1
- f.write(target + ' = ForceGroup.ForceGroup(\'%s\')\n' % \
- fg.getName())
- fg.printParams(f, target)
- f.write('self.addForceGroup(%s)\n' % target)
- # Close the file
- f.close()
- def loadConfig(self, filename):
- """loadConfig(filename)"""
- #try:
- # if vfs:
- print vfs.readFile(filename)
- exec vfs.readFile(filename)
- print "Particle Effect Reading using VFS"
- # else:
- # execfile(filename.toOsSpecific())
- # print "Shouldnt be wrong"
- #except:
- # self.notify.error('loadConfig: failed to load particle file: '+ repr(filename))
- def AppendConfig(self, f):
- f.write('\n')
- i1=" "
- i2=i1+i1
- # Make sure we start with a clean slate
- f.write(i2+'self.effect.reset()\n')
- pos = self.getPos()
- hpr = self.getHpr()
- scale = self.getScale()
- f.write(i2+'self.effect.setPos(%0.3f, %0.3f, %0.3f)\n' %
- (pos[0], pos[1], pos[2]))
- f.write(i2+'self.effect.setHpr(%0.3f, %0.3f, %0.3f)\n' %
- (hpr[0], hpr[1], hpr[2]))
- f.write(i2+'self.effect.setScale(%0.3f, %0.3f, %0.3f)\n' %
- (scale[0], scale[1], scale[2]))
- # Save all the particles to file
- num = 0
- for p in self.particlesDict.values():
- target = 'p%d' % num
- num = num + 1
- f.write(i2+"if(mode==0):\n")
- f.write(i2+i1+target + ' = seParticles.Particles(\'%s\')\n' % p.getName())
- f.write(i2+"else:\n")
- f.write(i2+i1+target + ' = Particles.Particles(\'%s\')\n' % p.getName())
- p.printParams(f, target)
- f.write(i2+'self.effect.addParticles(%s)\n' % target)
- # Save all the forces to file
- num = 0
- for fg in self.forceGroupDict.values():
- target = 'f%d' % num
- num = num + 1
- f.write(i2+target + ' = ForceGroup.ForceGroup(\'%s\')\n' % \
- fg.getName())
- fg.printParams(f, target)
- f.write(i2+'self.effect.addForceGroup(%s)\n' % target)
|