seParticles.py 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449
  1. from pandac.PandaModules import *
  2. from direct.particles.ParticleManagerGlobal import *
  3. from direct.showbase.PhysicsManagerGlobal import *
  4. from pandac import ParticleSystem
  5. from pandac import BaseParticleFactory
  6. from pandac import PointParticleFactory
  7. from pandac import ZSpinParticleFactory
  8. #import OrientedParticleFactory
  9. from pandac import BaseParticleRenderer
  10. from pandac import PointParticleRenderer
  11. from pandac import LineParticleRenderer
  12. from pandac import GeomParticleRenderer
  13. from pandac import SparkleParticleRenderer
  14. from pandac import SpriteParticleRenderer
  15. from pandac import BaseParticleEmitter
  16. from pandac import BoxEmitter
  17. from pandac import DiscEmitter
  18. from pandac import LineEmitter
  19. from pandac import PointEmitter
  20. from pandac import RectangleEmitter
  21. from pandac import RingEmitter
  22. from pandac import SphereSurfaceEmitter
  23. from pandac import SphereVolumeEmitter
  24. from pandac import TangentRingEmitter
  25. import string
  26. import os
  27. from direct.directnotify import DirectNotifyGlobal
  28. import sys
  29. class Particles(ParticleSystem.ParticleSystem):
  30. notify = DirectNotifyGlobal.directNotify.newCategory('Particles')
  31. id = 1
  32. def __init__(self, name=None, poolSize=1024):
  33. """__init__(name, poolSize)"""
  34. if (name == None):
  35. self.name = 'particles-%d' % Particles.id
  36. Particles.id += 1
  37. else:
  38. self.name = name
  39. ParticleSystem.ParticleSystem.__init__(self, poolSize)
  40. # self.setBirthRate(0.02)
  41. # self.setLitterSize(10)
  42. # self.setLitterSpread(0)
  43. # Set up a physical node
  44. self.node = PhysicalNode(self.name)
  45. self.nodePath = NodePath(self.node)
  46. self.setRenderParent(self.node)
  47. self.node.addPhysical(self)
  48. self.factory = None
  49. self.factoryType = "undefined"
  50. # self.setFactory("PointParticleFactory")
  51. self.renderer = None
  52. self.rendererType = "undefined"
  53. # self.setRenderer("PointParticleRenderer")
  54. self.emitter = None
  55. self.emitterType = "undefined"
  56. # self.setEmitter("SphereVolumeEmitter")
  57. # Enable particles by default
  58. self.fEnabled = 0
  59. #self.enable()
  60. def cleanup(self):
  61. self.disable()
  62. self.clearLinearForces()
  63. self.clearAngularForces()
  64. self.setRenderParent(self.node)
  65. self.node.removePhysical(self)
  66. self.nodePath.removeNode()
  67. del self.node
  68. del self.nodePath
  69. del self.factory
  70. del self.renderer
  71. del self.emitter
  72. def enable(self):
  73. """enable()"""
  74. if (self.fEnabled == 0):
  75. physicsMgr.attachPhysical(self)
  76. particleMgr.attachParticlesystem(self)
  77. self.fEnabled = 1
  78. def disable(self):
  79. """disable()"""
  80. if (self.fEnabled == 1):
  81. physicsMgr.removePhysical(self)
  82. particleMgr.removeParticlesystem(self)
  83. self.fEnabled = 0
  84. def isEnabled(self):
  85. return self.fEnabled
  86. def getNode(self):
  87. return self.node
  88. def setFactory(self, type):
  89. """setFactory(type)"""
  90. if (self.factoryType == type):
  91. return None
  92. if (self.factory):
  93. self.factory = None
  94. self.factoryType = type
  95. if (type == "PointParticleFactory"):
  96. self.factory = PointParticleFactory.PointParticleFactory()
  97. elif (type == "ZSpinParticleFactory"):
  98. self.factory = ZSpinParticleFactory.ZSpinParticleFactory()
  99. elif (type == "OrientedParticleFactory"):
  100. self.factory = OrientedParticleFactory.OrientedParticleFactory()
  101. else:
  102. print "unknown factory type: %s" % type
  103. return None
  104. self.factory.setLifespanBase(0.5)
  105. ParticleSystem.ParticleSystem.setFactory(self, self.factory)
  106. def setRenderer(self, type):
  107. """setRenderer(type)"""
  108. if (self.rendererType == type):
  109. return None
  110. if (self.renderer):
  111. self.renderer = None
  112. self.rendererType = type
  113. if (type == "PointParticleRenderer"):
  114. self.renderer = PointParticleRenderer.PointParticleRenderer()
  115. self.renderer.setPointSize(1.0)
  116. elif (type == "LineParticleRenderer"):
  117. self.renderer = LineParticleRenderer.LineParticleRenderer()
  118. elif (type == "GeomParticleRenderer"):
  119. self.renderer = GeomParticleRenderer.GeomParticleRenderer()
  120. npath = NodePath('default-geom')
  121. # This was moved here because we do not want to download
  122. # the direct tools with toontown.
  123. from direct.directtools import DirectSelection
  124. bbox = DirectSelection.DirectBoundingBox(npath)
  125. self.renderer.setGeomNode(bbox.lines.node())
  126. elif (type == "SparkleParticleRenderer"):
  127. self.renderer = SparkleParticleRenderer.SparkleParticleRenderer()
  128. elif (type == "SpriteParticleRenderer"):
  129. self.renderer = SpriteParticleRenderer.SpriteParticleRenderer()
  130. if (self.renderer.getSourceType() ==
  131. SpriteParticleRenderer.SpriteParticleRenderer.STTexture):
  132. # Use current default texture
  133. # See sourceTextureName SpriteParticleRenderer-extensions.py
  134. self.renderer.setTextureFromFile()
  135. else:
  136. # Use current default model file and node
  137. # See sourceFileName and sourceNodeName in SpriteParticleRenderer-extensions.py
  138. self.renderer.setTextureFromNode()
  139. else:
  140. print "unknown renderer type: %s" % type
  141. return None
  142. ParticleSystem.ParticleSystem.setRenderer(self, self.renderer)
  143. def setEmitter(self, type):
  144. """setEmitter(type)"""
  145. if (self.emitterType == type):
  146. return None
  147. if (self.emitter):
  148. self.emitter = None
  149. self.emitterType = type
  150. if (type == "BoxEmitter"):
  151. self.emitter = BoxEmitter.BoxEmitter()
  152. elif (type == "DiscEmitter"):
  153. self.emitter = DiscEmitter.DiscEmitter()
  154. elif (type == "LineEmitter"):
  155. self.emitter = LineEmitter.LineEmitter()
  156. elif (type == "PointEmitter"):
  157. self.emitter = PointEmitter.PointEmitter()
  158. elif (type == "RectangleEmitter"):
  159. self.emitter = RectangleEmitter.RectangleEmitter()
  160. elif (type == "RingEmitter"):
  161. self.emitter = RingEmitter.RingEmitter()
  162. elif (type == "SphereSurfaceEmitter"):
  163. self.emitter = SphereSurfaceEmitter.SphereSurfaceEmitter()
  164. elif (type == "SphereVolumeEmitter"):
  165. self.emitter = SphereVolumeEmitter.SphereVolumeEmitter()
  166. self.emitter.setRadius(1.0)
  167. elif (type == "TangentRingEmitter"):
  168. self.emitter = TangentRingEmitter.TangentRingEmitter()
  169. else:
  170. print "unknown emitter type: %s" % type
  171. return None
  172. ParticleSystem.ParticleSystem.setEmitter(self, self.emitter)
  173. def addForce(self, force):
  174. """addForce(force)"""
  175. if (force.isLinear()):
  176. self.addLinearForce(force)
  177. else:
  178. self.addAngularForce(force)
  179. def removeForce(self, force):
  180. """removeForce(force)"""
  181. if (force == None):
  182. self.notify.warning('removeForce() - force == None!')
  183. return
  184. if (force.isLinear()):
  185. self.removeLinearForce(force)
  186. else:
  187. self.removeAngularForce(force)
  188. def setRenderNodePath(self, nodePath):
  189. self.setRenderParent(nodePath.node())
  190. ## Getters ##
  191. def getName(self):
  192. """getName()"""
  193. return self.name
  194. def getFactory(self):
  195. """getFactory()"""
  196. return self.factory
  197. def getEmitter(self):
  198. """getEmitter()"""
  199. return self.emitter
  200. def getRenderer(self):
  201. """getRenderer()"""
  202. return self.renderer
  203. def printParams(self, file = sys.stdout, targ = 'self'):
  204. """printParams(file, targ)"""
  205. i1=" "
  206. i2=i1+i1
  207. file.write(i2+'# Particles parameters\n')
  208. file.write(i2+targ + '.setFactory(\"' + self.factoryType + '\")\n')
  209. file.write(i2+targ + '.setRenderer(\"' + self.rendererType + '\")\n')
  210. file.write(i2+targ + '.setEmitter(\"' + self.emitterType + '\")\n')
  211. # System parameters
  212. file.write(i2+targ + ('.setPoolSize(%d)\n' %
  213. int(self.getPoolSize())))
  214. file.write(i2+targ + ('.setBirthRate(%.4f)\n' %
  215. self.getBirthRate()))
  216. file.write(i2+targ + ('.setLitterSize(%d)\n' %
  217. int(self.getLitterSize())))
  218. file.write(i2+targ + ('.setLitterSpread(%d)\n' %
  219. self.getLitterSpread()))
  220. file.write(i2+targ + ('.setSystemLifespan(%.4f)\n' %
  221. self.getSystemLifespan()))
  222. file.write(i2+targ + ('.setLocalVelocityFlag(%d)\n' %
  223. self.getLocalVelocityFlag()))
  224. file.write(i2+targ + ('.setSystemGrowsOlderFlag(%d)\n' %
  225. self.getSystemGrowsOlderFlag()))
  226. file.write(i2+'# Factory parameters\n')
  227. file.write(i2+targ + ('.factory.setLifespanBase(%.4f)\n' %
  228. self.factory.getLifespanBase()))
  229. file.write(i2+targ + '.factory.setLifespanSpread(%.4f)\n' % \
  230. self.factory.getLifespanSpread())
  231. file.write(i2+targ + '.factory.setMassBase(%.4f)\n' % \
  232. self.factory.getMassBase())
  233. file.write(i2+targ + '.factory.setMassSpread(%.4f)\n' % \
  234. self.factory.getMassSpread())
  235. file.write(i2+targ + '.factory.setTerminalVelocityBase(%.4f)\n' % \
  236. self.factory.getTerminalVelocityBase())
  237. file.write(i2+targ + '.factory.setTerminalVelocitySpread(%.4f)\n' % \
  238. self.factory.getTerminalVelocitySpread())
  239. if (self.factoryType == "PointParticleFactory"):
  240. file.write(i2+'# Point factory parameters\n')
  241. elif (self.factoryType == "ZSpinParticleFactory"):
  242. file.write(i2+'# Z Spin factory parameters\n')
  243. file.write(i2+targ + '.factory.setInitialAngle(%.4f)\n' % \
  244. self.factory.getInitialAngle())
  245. file.write(i2+targ + '.factory.setInitialAngleSpread(%.4f)\n' % \
  246. self.factory.getInitialAngleSpread())
  247. file.write(i2+targ + '.factory.enableAngularVelocity(%d)\n' % \
  248. self.factory.getAngularVelocityEnabled())
  249. if(self.factory.getAngularVelocityEnabled()):
  250. file.write(i2+targ + '.factory.setAngularVelocity(%.4f)\n' % \
  251. self.factory.getAngularVelocity())
  252. file.write(i2+targ + '.factory.setAngularVelocitySpread(%.4f)\n' % \
  253. self.factory.getAngularVelocitySpread())
  254. else:
  255. file.write(i2+targ + '.factory.setFinalAngle(%.4f)\n' % \
  256. self.factory.getFinalAngle())
  257. file.write(i2+targ + '.factory.setFinalAngleSpread(%.4f)\n' % \
  258. self.factory.getFinalAngleSpread())
  259. elif (self.factoryType == "OrientedParticleFactory"):
  260. file.write(i2+'# Oriented factory parameters\n')
  261. file.write(i2+targ + '.factory.setInitialOrientation(%.4f)\n' % \
  262. self.factory.getInitialOrientation())
  263. file.write(i2+targ + '.factory.setFinalOrientation(%.4f)\n' % \
  264. self.factory.getFinalOrientation())
  265. file.write(i2+'# Renderer parameters\n')
  266. alphaMode = self.renderer.getAlphaMode()
  267. aMode = "PRALPHANONE"
  268. if (alphaMode == BaseParticleRenderer.BaseParticleRenderer.PRALPHANONE):
  269. aMode = "PRALPHANONE"
  270. elif (alphaMode ==
  271. BaseParticleRenderer.BaseParticleRenderer.PRALPHAOUT):
  272. aMode = "PRALPHAOUT"
  273. elif (alphaMode ==
  274. BaseParticleRenderer.BaseParticleRenderer.PRALPHAIN):
  275. aMode = "PRALPHAIN"
  276. elif (alphaMode ==
  277. BaseParticleRenderer.BaseParticleRenderer.PRALPHAUSER):
  278. aMode = "PRALPHAUSER"
  279. file.write(i2+targ + '.renderer.setAlphaMode(BaseParticleRenderer.' + aMode + ')\n')
  280. file.write(i2+targ + '.renderer.setUserAlpha(%.2f)\n' % \
  281. self.renderer.getUserAlpha())
  282. if (self.rendererType == "PointParticleRenderer"):
  283. file.write(i2+'# Point parameters\n')
  284. file.write(i2+targ + '.renderer.setPointSize(%.2f)\n' % \
  285. self.renderer.getPointSize())
  286. sColor = self.renderer.getStartColor()
  287. file.write(i2+(targ + '.renderer.setStartColor(Vec4(%.2f, %.2f, %.2f, %.2f))\n' % (sColor[0], sColor[1], sColor[2], sColor[3])))
  288. sColor = self.renderer.getEndColor()
  289. file.write(i2+(targ + '.renderer.setEndColor(Vec4(%.2f, %.2f, %.2f, %.2f))\n' % (sColor[0], sColor[1], sColor[2], sColor[3])))
  290. blendType = self.renderer.getBlendType()
  291. bType = "PPONECOLOR"
  292. if (blendType == PointParticleRenderer.PointParticleRenderer.PPONECOLOR):
  293. bType = "PPONECOLOR"
  294. elif (blendType == PointParticleRenderer.PointParticleRenderer.PPBLENDLIFE):
  295. bType = "PPBLENDLIFE"
  296. elif (blendType == PointParticleRenderer.PointParticleRenderer.PPBLENDVEL):
  297. bType = "PPBLENDVEL"
  298. file.write(i2+targ + '.renderer.setBlendType(PointParticleRenderer.' + bType + ')\n')
  299. blendMethod = self.renderer.getBlendMethod()
  300. bMethod = "PPNOBLEND"
  301. if (blendMethod == BaseParticleRenderer.BaseParticleRenderer.PPNOBLEND):
  302. bMethod = "PPNOBLEND"
  303. elif (blendMethod == BaseParticleRenderer.BaseParticleRenderer.PPBLENDLINEAR):
  304. bMethod = "PPBLENDLINEAR"
  305. elif (blendMethod == BaseParticleRenderer.BaseParticleRenderer.PPBLENDCUBIC):
  306. bMethod = "PPBLENDCUBIC"
  307. file.write(i2+targ + '.renderer.setBlendMethod(BaseParticleRenderer.' + bMethod + ')\n')
  308. elif (self.rendererType == "LineParticleRenderer"):
  309. file.write(i2+'# Line parameters\n')
  310. sColor = self.renderer.getHeadColor()
  311. file.write(i2+(targ + '.renderer.setHeadColor(Vec4(%.2f, %.2f, %.2f, %.2f))\n' % (sColor[0], sColor[1], sColor[2], sColor[3])))
  312. sColor = self.renderer.getTailColor()
  313. file.write(i2+(targ + '.renderer.setTailColor(Vec4(%.2f, %.2f, %.2f, %.2f))\n' % (sColor[0], sColor[1], sColor[2], sColor[3])))
  314. elif (self.rendererType == "GeomParticleRenderer"):
  315. file.write(i2+'# Geom parameters\n')
  316. node = self.renderer.getGeomNode()
  317. file.write(i2+targ + '.renderer.setGeomNode(' + node.getName() + ')\n')
  318. elif (self.rendererType == "SparkleParticleRenderer"):
  319. file.write(i2+'# Sparkle parameters\n')
  320. sColor = self.renderer.getCenterColor()
  321. file.write(i2+(targ + '.renderer.setCenterColor(Vec4(%.2f, %.2f, %.2f, %.2f))\n' % (sColor[0], sColor[1], sColor[2], sColor[3])))
  322. sColor = self.renderer.getEdgeColor()
  323. file.write(i2+(targ + '.renderer.setEdgeColor(Vec4(%.2f, %.2f, %.2f, %.2f))\n' % (sColor[0], sColor[1], sColor[2], sColor[3])))
  324. file.write(i2+targ + '.renderer.setBirthRadius(%.4f)\n' % self.renderer.getBirthRadius())
  325. file.write(i2+targ + '.renderer.setDeathRadius(%.4f)\n' % self.renderer.getDeathRadius())
  326. lifeScale = self.renderer.getLifeScale()
  327. lScale = "SPNOSCALE"
  328. if (lifeScale == SparkleParticleRenderer.SparkleParticleRenderer.SPSCALE):
  329. lScale = "SPSCALE"
  330. file.write(i2+targ + '.renderer.setLifeScale(SparkleParticleRenderer.' + lScale + ')\n')
  331. elif (self.rendererType == "SpriteParticleRenderer"):
  332. file.write(i2+'# Sprite parameters\n')
  333. if (self.renderer.getSourceType() ==
  334. SpriteParticleRenderer.SpriteParticleRenderer.STTexture):
  335. tex = self.renderer.getTexture()
  336. file.write(i2+targ + '.renderer.setTexture(loader.loadTexture(\'' + tex.getFilename().getFullpath() + '\'))\n')
  337. else:
  338. modelName = self.renderer.getSourceFileName()
  339. nodeName = self.renderer.getSourceNodeName()
  340. file.write(i2+targ + '.renderer.setTextureFromNode("%s", "%s")\n' % (modelName, nodeName))
  341. sColor = self.renderer.getColor()
  342. file.write(i2+(targ + '.renderer.setColor(Vec4(%.2f, %.2f, %.2f, %.2f))\n' % (sColor[0], sColor[1], sColor[2], sColor[3])))
  343. file.write(i2+targ + '.renderer.setXScaleFlag(%d)\n' % self.renderer.getXScaleFlag())
  344. file.write(i2+targ + '.renderer.setYScaleFlag(%d)\n' % self.renderer.getYScaleFlag())
  345. file.write(i2+targ + '.renderer.setAnimAngleFlag(%d)\n' % self.renderer.getAnimAngleFlag())
  346. file.write(i2+targ + '.renderer.setInitialXScale(%.4f)\n' % self.renderer.getInitialXScale())
  347. file.write(i2+targ + '.renderer.setFinalXScale(%.4f)\n' % self.renderer.getFinalXScale())
  348. file.write(i2+targ + '.renderer.setInitialYScale(%.4f)\n' % self.renderer.getInitialYScale())
  349. file.write(i2+targ + '.renderer.setFinalYScale(%.4f)\n' % self.renderer.getFinalYScale())
  350. file.write(i2+targ + '.renderer.setNonanimatedTheta(%.4f)\n' % self.renderer.getNonanimatedTheta())
  351. blendMethod = self.renderer.getAlphaBlendMethod()
  352. bMethod = "PPNOBLEND"
  353. if (blendMethod == BaseParticleRenderer.BaseParticleRenderer.PPNOBLEND):
  354. bMethod = "PPNOBLEND"
  355. elif (blendMethod == BaseParticleRenderer.BaseParticleRenderer.PPBLENDLINEAR):
  356. bMethod = "PPBLENDLINEAR"
  357. elif (blendMethod == BaseParticleRenderer.BaseParticleRenderer.PPBLENDCUBIC):
  358. bMethod = "PPBLENDCUBIC"
  359. file.write(i2+targ + '.renderer.setAlphaBlendMethod(BaseParticleRenderer.' + bMethod + ')\n')
  360. file.write(i2+targ + '.renderer.setAlphaDisable(%d)\n' % self.renderer.getAlphaDisable())
  361. file.write(i2+'# Emitter parameters\n')
  362. emissionType = self.emitter.getEmissionType()
  363. eType = "ETEXPLICIT"
  364. if (emissionType == BaseParticleEmitter.BaseParticleEmitter.ETEXPLICIT):
  365. eType = "ETEXPLICIT"
  366. elif (emissionType == BaseParticleEmitter.BaseParticleEmitter.ETRADIATE):
  367. eType = "ETRADIATE"
  368. elif (emissionType == BaseParticleEmitter.BaseParticleEmitter.ETCUSTOM):
  369. eType = "ETCUSTOM"
  370. file.write(i2+targ + '.emitter.setEmissionType(BaseParticleEmitter.' + eType + ')\n')
  371. file.write(i2+targ + '.emitter.setAmplitude(%.4f)\n' % self.emitter.getAmplitude())
  372. file.write(i2+targ + '.emitter.setAmplitudeSpread(%.4f)\n' % self.emitter.getAmplitudeSpread())
  373. oForce = self.emitter.getOffsetForce()
  374. file.write(i2+(targ + '.emitter.setOffsetForce(Vec3(%.4f, %.4f, %.4f))\n' % (oForce[0], oForce[1], oForce[2])))
  375. oForce = self.emitter.getExplicitLaunchVector()
  376. file.write(i2+(targ + '.emitter.setExplicitLaunchVector(Vec3(%.4f, %.4f, %.4f))\n' % (oForce[0], oForce[1], oForce[2])))
  377. orig = self.emitter.getRadiateOrigin()
  378. file.write(i2+(targ + '.emitter.setRadiateOrigin(Point3(%.4f, %.4f, %.4f))\n' % (orig[0], orig[1], orig[2])))
  379. if (self.emitterType == "BoxEmitter"):
  380. file.write(i2+'# Box parameters\n')
  381. bound = self.emitter.getMinBound()
  382. file.write(i2+(targ + '.emitter.setMinBound(Point3(%.4f, %.4f, %.4f))\n' % (bound[0], bound[1], bound[2])))
  383. bound = self.emitter.getMaxBound()
  384. file.write(i2+(targ + '.emitter.setMaxBound(Point3(%.4f, %.4f, %.4f))\n' % (bound[0], bound[1], bound[2])))
  385. elif (self.emitterType == "DiscEmitter"):
  386. file.write(i2+'# Disc parameters\n')
  387. file.write(i2+targ + '.emitter.setRadius(%.4f)\n' % self.emitter.getRadius())
  388. if (eType == "ETCUSTOM"):
  389. file.write(i2+targ + '.emitter.setOuterAngle(%.4f)\n' % self.emitter.getOuterAngle())
  390. file.write(i2+targ + '.emitter.setInnerAngle(%.4f)\n' % self.emitter.getInnerAngle())
  391. file.write(i2+targ + '.emitter.setOuterMagnitude(%.4f)\n' % self.emitter.getOuterMagnitude())
  392. file.write(i2+targ + '.emitter.setInnerMagnitude(%.4f)\n' % self.emitter.getInnerMagnitude())
  393. file.write(i2+targ + '.emitter.setCubicLerping(%d)\n' % self.emitter.getCubicLerping())
  394. elif (self.emitterType == "LineEmitter"):
  395. file.write(i2+'# Line parameters\n')
  396. point = self.emitter.getEndpoint1()
  397. file.write(i2+(targ + '.emitter.setEndpoint1(Point3(%.4f, %.4f, %.4f))\n' % (point[0], point[1], point[2])))
  398. point = self.emitter.getEndpoint2()
  399. file.write(i2+(targ + '.emitter.setEndpoint2(Point3(%.4f, %.4f, %.4f))\n' % (point[0], point[1], point[2])))
  400. elif (self.emitterType == "PointEmitter"):
  401. file.write(i2+'# Point parameters\n')
  402. point = self.emitter.getLocation()
  403. file.write(i2+(targ + '.emitter.setLocation(Point3(%.4f, %.4f, %.4f))\n' % (point[0], point[1], point[2])))
  404. elif (self.emitterType == "RectangleEmitter"):
  405. file.write(i2+'# Rectangle parameters\n')
  406. point = self.emitter.getMinBound()
  407. file.write(i2+(targ + '.emitter.setMinBound(Point2(%.4f, %.4f))\n' % (point[0], point[1])))
  408. point = self.emitter.getMaxBound()
  409. file.write(i2+(targ + '.emitter.setMaxBound(Point2(%.4f, %.4f))\n' % (point[0], point[1])))
  410. elif (self.emitterType == "RingEmitter"):
  411. file.write(i2+'# Ring parameters\n')
  412. file.write(i2+targ + '.emitter.setRadius(%.4f)\n' % self.emitter.getRadius())
  413. if (eType == "ETCUSTOM"):
  414. file.write(i2+targ + '.emitter.setAngle(%.4f)\n' % self.emitter.getAngle())
  415. elif (self.emitterType == "SphereSurfaceEmitter"):
  416. file.write(i2+'# Sphere Surface parameters\n')
  417. file.write(i2+targ + '.emitter.setRadius(%.4f)\n' % self.emitter.getRadius())
  418. elif (self.emitterType == "SphereVolumeEmitter"):
  419. file.write(i2+'# Sphere Volume parameters\n')
  420. file.write(i2+targ + '.emitter.setRadius(%.4f)\n' % self.emitter.getRadius())
  421. elif (self.emitterType == "TangentRingEmitter"):
  422. file.write(i2+'# Tangent Ring parameters\n')
  423. file.write(i2+targ + '.emitter.setRadius(%.4f)\n' % self.emitter.getRadius())