seParticles.py 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449
  1. from PandaModules import *
  2. from ParticleManagerGlobal import *
  3. from PhysicsManagerGlobal import *
  4. import ParticleSystem
  5. import BaseParticleFactory
  6. import PointParticleFactory
  7. import ZSpinParticleFactory
  8. #import OrientedParticleFactory
  9. import BaseParticleRenderer
  10. import PointParticleRenderer
  11. import LineParticleRenderer
  12. import GeomParticleRenderer
  13. import SparkleParticleRenderer
  14. import SpriteParticleRenderer
  15. import BaseParticleEmitter
  16. import BoxEmitter
  17. import DiscEmitter
  18. import LineEmitter
  19. import PointEmitter
  20. import RectangleEmitter
  21. import RingEmitter
  22. import SphereSurfaceEmitter
  23. import SphereVolumeEmitter
  24. import TangentRingEmitter
  25. import string
  26. import os
  27. 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. 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())