seParticleEffect.py 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  1. from pandac.PandaModules import *
  2. import seParticles
  3. import seForceGroup
  4. from direct.directnotify import DirectNotifyGlobal
  5. class ParticleEffect(NodePath):
  6. notify = DirectNotifyGlobal.directNotify.newCategory('ParticleEffect')
  7. pid = 1
  8. def __init__(self, name=None, particles=None):
  9. """__init__()"""
  10. if (name == None):
  11. name = 'particle-effect-%d' % ParticleEffect.pid
  12. ParticleEffect.pid += 1
  13. NodePath.__init__(self, name)
  14. # Record particle effect name
  15. self.name = name
  16. # Enabled flag
  17. self.fEnabled = 0
  18. # Dictionary of particles and forceGroups
  19. self.particlesDict = {}
  20. self.forceGroupDict = {}
  21. # The effect's particle system
  22. if (particles != None):
  23. self.addParticles(particles)
  24. self.renderParent = None
  25. def start(self, parent=None, renderParent=None):
  26. assert(self.notify.debug('start() - name: %s' % self.name))
  27. self.renderParent = renderParent
  28. self.enable()
  29. if (parent != None):
  30. self.reparentTo(parent)
  31. def cleanup(self):
  32. self.removeNode()
  33. self.disable()
  34. for f in self.forceGroupDict.values():
  35. f.cleanup()
  36. for p in self.particlesDict.values():
  37. p.cleanup()
  38. del self.renderParent
  39. del self.particlesDict
  40. del self.forceGroupDict
  41. def reset(self):
  42. self.removeAllForces()
  43. self.removeAllParticles()
  44. self.forceGroupDict = {}
  45. self.particlesDict = {}
  46. def enable(self):
  47. """enable()"""
  48. if (self.renderParent != None):
  49. for p in self.particlesDict.values():
  50. p.setRenderParent(self.renderParent.node())
  51. for f in self.forceGroupDict.values():
  52. f.enable()
  53. for p in self.particlesDict.values():
  54. p.enable()
  55. self.fEnabled = 1
  56. def disable(self):
  57. """disable()"""
  58. self.detachNode()
  59. for p in self.particlesDict.values():
  60. p.setRenderParent(p.node)
  61. for f in self.forceGroupDict.values():
  62. f.disable()
  63. for p in self.particlesDict.values():
  64. p.disable()
  65. self.fEnabled = 0
  66. def isEnabled(self):
  67. """
  68. isEnabled()
  69. Note: this may be misleading if enable(),disable() not used
  70. """
  71. return self.fEnabled
  72. def addForceGroup(self, forceGroup):
  73. """addForceGroup(forceGroup)"""
  74. forceGroup.nodePath.reparentTo(self)
  75. forceGroup.particleEffect = self
  76. self.forceGroupDict[forceGroup.getName()] = forceGroup
  77. # Associate the force group with all particles
  78. for i in range(len(forceGroup)):
  79. self.addForce(forceGroup[i])
  80. def addForce(self, force):
  81. """addForce(force)"""
  82. for p in self.particlesDict.values():
  83. p.addForce(force)
  84. def removeForceGroup(self, forceGroup):
  85. """removeForceGroup(forceGroup)"""
  86. # Remove forces from all particles
  87. for i in range(len(forceGroup)):
  88. self.removeForce(forceGroup[i])
  89. forceGroup.nodePath.removeNode()
  90. forceGroup.particleEffect = None
  91. del self.forceGroupDict[forceGroup.getName()]
  92. def removeForce(self, force):
  93. """removeForce(force)"""
  94. for p in self.particlesDict.values():
  95. p.removeForce(force)
  96. def removeAllForces(self):
  97. for fg in self.forceGroupDict.values():
  98. self.removeForceGroup(fg)
  99. def addParticles(self, particles):
  100. """addParticles(particles)"""
  101. particles.nodePath.reparentTo(self)
  102. self.particlesDict[particles.getName()] = particles
  103. # Associate all forces in all force groups with the particles
  104. for fg in self.forceGroupDict.values():
  105. for i in range(len(fg)):
  106. particles.addForce(fg[i])
  107. def removeParticles(self, particles):
  108. """removeParticles(particles)"""
  109. if (particles == None):
  110. self.notify.warning('removeParticles() - particles == None!')
  111. return
  112. particles.nodePath.detachNode()
  113. del self.particlesDict[particles.getName()]
  114. # Remove all forces from the particles
  115. for fg in self.forceGroupDict.values():
  116. for f in fg.asList():
  117. particles.removeForce(f)
  118. def removeAllParticles(self):
  119. for p in self.particlesDict.values():
  120. self.removeParticles(p)
  121. def getParticlesList(self):
  122. """getParticles()"""
  123. return self.particlesDict.values()
  124. def getParticlesNamed(self, name):
  125. """getParticlesNamed(name)"""
  126. return self.particlesDict.get(name, None)
  127. def getParticlesDict(self):
  128. """getParticlesDict()"""
  129. return self.particlesDict
  130. def getForceGroupList(self):
  131. """getForceGroup()"""
  132. return self.forceGroupDict.values()
  133. def getForceGroupNamed(self, name):
  134. """getForceGroupNamed(name)"""
  135. return self.forceGroupDict.get(name, None)
  136. def getForceGroupDict(self):
  137. """getForceGroup()"""
  138. return self.forceGroupDict
  139. def saveConfig(self, filename):
  140. """saveFileData(filename)"""
  141. f = open(filename.toOsSpecific(), 'wb')
  142. # Add a blank line
  143. f.write('\n')
  144. # Make sure we start with a clean slate
  145. f.write('self.reset()\n')
  146. pos = self.getPos()
  147. hpr = self.getHpr()
  148. scale = self.getScale()
  149. f.write('self.setPos(%0.3f, %0.3f, %0.3f)\n' %
  150. (pos[0], pos[1], pos[2]))
  151. f.write('self.setHpr(%0.3f, %0.3f, %0.3f)\n' %
  152. (hpr[0], hpr[1], hpr[2]))
  153. f.write('self.setScale(%0.3f, %0.3f, %0.3f)\n' %
  154. (scale[0], scale[1], scale[2]))
  155. # Save all the particles to file
  156. num = 0
  157. for p in self.particlesDict.values():
  158. target = 'p%d' % num
  159. num = num + 1
  160. f.write(target + ' = Particles.Particles(\'%s\')\n' % p.getName())
  161. p.printParams(f, target)
  162. f.write('self.addParticles(%s)\n' % target)
  163. # Save all the forces to file
  164. num = 0
  165. for fg in self.forceGroupDict.values():
  166. target = 'f%d' % num
  167. num = num + 1
  168. f.write(target + ' = ForceGroup.ForceGroup(\'%s\')\n' % \
  169. fg.getName())
  170. fg.printParams(f, target)
  171. f.write('self.addForceGroup(%s)\n' % target)
  172. # Close the file
  173. f.close()
  174. def loadConfig(self, filename):
  175. """loadConfig(filename)"""
  176. #try:
  177. # if vfs:
  178. print vfs.readFile(filename)
  179. exec vfs.readFile(filename)
  180. print "Particle Effect Reading using VFS"
  181. # else:
  182. # execfile(filename.toOsSpecific())
  183. # print "Shouldnt be wrong"
  184. #except:
  185. # self.notify.error('loadConfig: failed to load particle file: '+ repr(filename))
  186. def AppendConfig(self, f):
  187. f.write('\n')
  188. i1=" "
  189. i2=i1+i1
  190. # Make sure we start with a clean slate
  191. f.write(i2+'self.effect.reset()\n')
  192. pos = self.getPos()
  193. hpr = self.getHpr()
  194. scale = self.getScale()
  195. f.write(i2+'self.effect.setPos(%0.3f, %0.3f, %0.3f)\n' %
  196. (pos[0], pos[1], pos[2]))
  197. f.write(i2+'self.effect.setHpr(%0.3f, %0.3f, %0.3f)\n' %
  198. (hpr[0], hpr[1], hpr[2]))
  199. f.write(i2+'self.effect.setScale(%0.3f, %0.3f, %0.3f)\n' %
  200. (scale[0], scale[1], scale[2]))
  201. # Save all the particles to file
  202. num = 0
  203. for p in self.particlesDict.values():
  204. target = 'p%d' % num
  205. num = num + 1
  206. f.write(i2+"if(mode==0):\n")
  207. f.write(i2+i1+target + ' = seParticles.Particles(\'%s\')\n' % p.getName())
  208. f.write(i2+"else:\n")
  209. f.write(i2+i1+target + ' = Particles.Particles(\'%s\')\n' % p.getName())
  210. p.printParams(f, target)
  211. f.write(i2+'self.effect.addParticles(%s)\n' % target)
  212. # Save all the forces to file
  213. num = 0
  214. for fg in self.forceGroupDict.values():
  215. target = 'f%d' % num
  216. num = num + 1
  217. f.write(i2+target + ' = ForceGroup.ForceGroup(\'%s\')\n' % \
  218. fg.getName())
  219. fg.printParams(f, target)
  220. f.write(i2+'self.effect.addForceGroup(%s)\n' % target)