ParticleEffect.py 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. from PandaModules import *
  2. import Particles
  3. import ForceGroup
  4. import DirectNotifyGlobal
  5. # NOTE: these two calls were moved here from BattleParticles
  6. # to avoid DIRECT depending on TOONTOWN! - gregw
  7. def startParticleEffect(effect, parent, worldRelative=1):
  8. assert(effect != None and parent != None)
  9. #notify.debug('startParticleEffect() - name: %s' % effect.getName())
  10. particles = effect.getParticlesNamed('particles-1')
  11. if (worldRelative == 1):
  12. particles.setRenderParent(render.node())
  13. effect.enable()
  14. effect.reparentTo(parent)
  15. def cleanupParticleEffect(effect):
  16. assert(effect != None)
  17. #notify.debug('cleanupParticleEffect() - %s' % effect.getName())
  18. effect.disable()
  19. effect.reparentTo(hidden)
  20. effect.cleanup()
  21. class ParticleEffect(NodePath):
  22. notify = DirectNotifyGlobal.directNotify.newCategory('ParticleEffect')
  23. pid = 1
  24. def __init__(self, name=None, particles=None):
  25. """__init__()"""
  26. NodePath.__init__(self)
  27. if (name == None):
  28. name = 'particle-effect-%d' % ParticleEffect.pid
  29. ParticleEffect.pid += 1
  30. self.assign(hidden.attachNewNode(name))
  31. # Record particle effect name
  32. self.name = name
  33. # Enabled flag
  34. self.fEnabled = 0
  35. # Dictionary of particles and forceGroups
  36. self.particlesDict = {}
  37. self.forceGroupDict = {}
  38. # The effect's particle system
  39. if (particles != None):
  40. self.addParticles(particles)
  41. def cleanup(self):
  42. for f in self.forceGroupDict.values():
  43. f.cleanup()
  44. for p in self.particlesDict.values():
  45. p.cleanup()
  46. forceGroupDict = {}
  47. particlesDict = {}
  48. self.removeNode()
  49. def reset(self):
  50. self.removeAllForces()
  51. self.removeAllParticles()
  52. self.forceGroupDict = {}
  53. self.particlesDict = {}
  54. def enable(self):
  55. """enable()"""
  56. for f in self.forceGroupDict.values():
  57. f.enable()
  58. for p in self.particlesDict.values():
  59. p.enable()
  60. self.fEnabled = 1
  61. def disable(self):
  62. """disable()"""
  63. for f in self.forceGroupDict.values():
  64. f.disable()
  65. for p in self.particlesDict.values():
  66. p.disable()
  67. self.fEnabled = 0
  68. def isEnabled(self):
  69. """
  70. isEnabled()
  71. Note: this may be misleading if enable(),disable() not used
  72. """
  73. return self.fEnabled
  74. def addForceGroup(self, forceGroup):
  75. """addForceGroup(forceGroup)"""
  76. forceGroup.nodePath.reparentTo(self)
  77. forceGroup.particleEffect = self
  78. self.forceGroupDict[forceGroup.getName()] = forceGroup
  79. # Associate the force group with all particles
  80. for f in forceGroup.asList():
  81. self.addForce(f)
  82. def addForce(self, force):
  83. """addForce(force)"""
  84. for p in self.particlesDict.values():
  85. p.addForce(force)
  86. def removeForceGroup(self, forceGroup):
  87. """removeForceGroup(forceGroup)"""
  88. # Remove forces from all particles
  89. for f in forceGroup.asList():
  90. self.removeForce(f)
  91. forceGroup.nodePath.reparentTo(hidden)
  92. forceGroup.particleEffect = None
  93. del self.forceGroupDict[forceGroup.getName()]
  94. def removeForce(self, force):
  95. """removeForce(force)"""
  96. for p in self.particlesDict.values():
  97. p.removeForce(force)
  98. def removeAllForces(self):
  99. for fg in self.forceGroupDict.values():
  100. self.removeForceGroup(fg)
  101. def addParticles(self, particles):
  102. """addParticles(particles)"""
  103. particles.nodePath.reparentTo(self)
  104. self.particlesDict[particles.getName()] = particles
  105. # Associate all forces in all force groups with the particles
  106. for fg in self.forceGroupDict.values():
  107. for f in fg.asList():
  108. particles.addForce(f)
  109. def removeParticles(self, particles):
  110. """removeParticles(particles)"""
  111. if (particles == None):
  112. self.notify.warning('removeParticles() - particles == None!')
  113. return
  114. particles.nodePath.reparentTo(hidden)
  115. del self.particlesDict[particles.getName()]
  116. # Remove all forces from the particles
  117. for fg in self.forceGroupDict.values():
  118. for f in fg.asList():
  119. particles.removeForce(f)
  120. def removeAllParticles(self):
  121. for p in self.particlesDict.values():
  122. self.removeParticles(p)
  123. def getParticlesList(self):
  124. """getParticles()"""
  125. return self.particlesDict.values()
  126. def getParticlesNamed(self, name):
  127. """getParticlesNamed(name)"""
  128. return self.particlesDict.get(name, None)
  129. def getParticlesDict(self):
  130. """getParticlesDict()"""
  131. return self.particlesDict
  132. def getForceGroupList(self):
  133. """getForceGroup()"""
  134. return self.forceGroupDict.values()
  135. def getForceGroupNamed(self, name):
  136. """getForceGroupNamed(name)"""
  137. return self.forceGroupDict.get(name, None)
  138. def getForceGroupDict(self):
  139. """getForceGroup()"""
  140. return self.forceGroupDict
  141. def saveConfig(self, filename):
  142. """saveFileData(filename)"""
  143. f = open(filename.toOsSpecific(), 'wb')
  144. # Add a blank line
  145. f.write('\n')
  146. # Make sure we start with a clean slate
  147. f.write('self.reset()\n')
  148. pos = self.getPos()
  149. hpr = self.getHpr()
  150. scale = self.getScale()
  151. f.write('self.setPos(%0.3f, %0.3f, %0.3f)\n' %
  152. (pos[0], pos[1], pos[2]))
  153. f.write('self.setHpr(%0.3f, %0.3f, %0.3f)\n' %
  154. (hpr[0], hpr[1], hpr[2]))
  155. f.write('self.setScale(%0.3f, %0.3f, %0.3f)\n' %
  156. (scale[0], scale[1], scale[2]))
  157. # Save all the particles to file
  158. num = 0
  159. for p in self.particlesDict.values():
  160. target = 'p%d' % num
  161. num = num + 1
  162. f.write(target + ' = Particles.Particles(\'%s\')\n' % p.getName())
  163. p.printParams(f, target)
  164. f.write('self.addParticles(%s)\n' % target)
  165. # Save all the forces to file
  166. num = 0
  167. for fg in self.forceGroupDict.values():
  168. target = 'f%d' % num
  169. num = num + 1
  170. f.write(target + ' = ForceGroup.ForceGroup(\'%s\')\n' % \
  171. fg.getName())
  172. fg.printParams(f, target)
  173. f.write('self.addForceGroup(%s)\n' % target)
  174. # Close the file
  175. f.close()
  176. def loadConfig(self, filename):
  177. """loadConfig(filename)"""
  178. execfile(filename.toOsSpecific())