seFileSaver.py 61 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915
  1. ####################################################################################################################################################
  2. # File Saving
  3. # This code saves the scene out as python code... the scene is stored in the various dictionaries in "dataHolder.py" ...the class "AllScene"
  4. #
  5. ####################################################################################################################################################
  6. from pandac.PandaModules import *
  7. from direct.showbase.ShowBaseGlobal import *
  8. import os
  9. import shutil
  10. import string
  11. ####################################################################################################################################################
  12. #### These modules are modified versions of Disney's equivalent modules
  13. #### We need to figure out a way to inherit their modules and overwrite what we need changed
  14. import seParticlePanel
  15. import seParticles
  16. import seParticleEffect
  17. import seForceGroup
  18. ####################################################################################################################################################
  19. class FileSaver:
  20. ####################################################################################################################################################
  21. # This class saves out the scene built with the scene editor as python code
  22. # There are dictionaries saved out to save the state of the scene for reloading it with the editor
  23. # Currently saving is supported for Models, Animations, Lights, Dummy Nodes
  24. # Attributes like parenting are also saved out
  25. # This class is actually instantiated in sceneEditor.py in the saveScene() method
  26. ####################################################################################################################################################
  27. def __init(self):
  28. pass
  29. def SaveFile(self,AllScene,filename,dirname,reSaveFlag=0):
  30. ################################################################################################################################################
  31. # This function takes the "dataHolder" instance "AllScene" which has dictionaries containing scene information
  32. # The filename is where the scene will be written to
  33. ################################################################################################################################################
  34. i1=" " # indentation
  35. i2=i1+i1 # double indentation
  36. out_file = open(filename,"w")
  37. print "dirname:" + dirname
  38. if( not os.path.isdir(dirname)):
  39. os.mkdir(dirname)
  40. savepathname=Filename(filename)
  41. self.savepath=savepathname.getBasenameWoExtension()
  42. out_file.write("##########################################################################################################\n")
  43. out_file.write("# Auto Generated Code by Scene Editor\n")
  44. out_file.write("# Edit with caution\n")
  45. out_file.write("# Using this file in your code:\n")
  46. out_file.write("# For example, if you have named this file as \"myscene.py\"\n")
  47. out_file.write("# Do the following:\n")
  48. out_file.write("# from myscene import * \n")
  49. out_file.write("# theScene=SavedScene() #instantiate the class\n")
  50. out_file.write("# IMPORTANT: All the documentation below refers to \"theScene\" as the instance of SavedScene()\n")
  51. out_file.write("##########################################################################################################\n\n")
  52. out_file.write("##########################################################################################################\n")
  53. out_file.write("# Import Panda Modules\n")
  54. out_file.write("##########################################################################################################\n")
  55. out_file.write("from direct.directbase.DirectStart import * # Core functionality for running the \"show\"\n")
  56. out_file.write("from direct.actor import Actor # Importing models with animations\n")
  57. out_file.write("from direct.directutil import Mopath # Motion Paths\n")
  58. out_file.write("from direct.interval import MopathInterval # Motion Paths\n")
  59. out_file.write("from direct.interval.IntervalGlobal import * # Intervals for interpolation, sequencing and parallelization\n")
  60. out_file.write("from direct.particles import ParticleEffect # Particle Systems\n")
  61. out_file.write("from direct.particles import ForceGroup # Forces acting on Particles\n")
  62. out_file.write("from direct.particles import Particles\n\n")
  63. out_file.write("##########################################################################################################\n")
  64. out_file.write("# This class stores the entire scene\n")
  65. out_file.write("##########################################################################################################\n\n")
  66. out_file.write("class SavedScene(DirectObject): # We inherit from DirectObject so that we can use self.accept method to catch messages\n")
  67. out_file.write("\n")
  68. out_file.write(i1+"# These dictionaries are required for re-loading a scene in the editor\n")
  69. out_file.write(i1+"# They can be used to access the objects as well\n\n")
  70. out_file.write(i1+"ModelDic={}# Stores all the models and static geometry\n")
  71. out_file.write(i1+"ModelRefDic={}# Stores the paths to the models\n")
  72. out_file.write("\n")
  73. out_file.write(i1+"ActorDic={}# Stores all the actors\n")
  74. out_file.write(i1+"ActorRefDic={}# Stores the paths to the actors\n")
  75. out_file.write(i1+"ActorAnimsDic={}# Stores the animations for each actor\n")
  76. out_file.write(i1+"blendAnimDict={}# Stores all the blended animations\n")
  77. out_file.write("\n")
  78. out_file.write(i1+"LightDict={}# Stores all the lights\n")
  79. out_file.write(i1+"LightTypes={}# Stores types for the lights\n")
  80. out_file.write(i1+"LightNodes={}# Stores the actual nodes for the lights\n")
  81. out_file.write("\n")
  82. out_file.write(i1+"dummyDict={}# Stores dummies\n")
  83. out_file.write("\n")
  84. out_file.write(i1+"collisionDict={}# Stores Collision information\n")
  85. out_file.write("\n")
  86. out_file.write(i1+"curveDict={}# Stores Mopath information\n")
  87. out_file.write(i1+"curveIntervals=[]# Stores list of mopath intervals\n")
  88. out_file.write(i1+"curveRefColl=[]# Stores paths to mopaths\n")
  89. out_file.write(i1+"curveIntervalsDict={}# Stores mopath intervals\n")
  90. out_file.write("\n")
  91. out_file.write(i1+"particleDict={}# Stores particles\n")
  92. out_file.write(i1+"particleNodes={}# Stores particle nodes\n")
  93. out_file.write("\n")
  94. out_file.write(i1+"#Light Count\n")
  95. out_file.write(i1+"ambientCount=0\n")
  96. out_file.write(i1+"directionalCount=0\n")
  97. out_file.write(i1+"pointCount=0\n")
  98. out_file.write(i1+"spotCount=0\n")
  99. out_file.write("\n")
  100. out_file.write(i1+"#Lighting Attribute\n")
  101. out_file.write(i1+"lightAttrib = LightAttrib.makeAllOff()# Initialize lighting\n")
  102. out_file.write("\n")
  103. out_file.write(i1+"CollisionHandler=CollisionHandlerEvent()# Setup a Collision Handler\n")
  104. out_file.write(i1+"##########################################################################################################\n")
  105. out_file.write(i1+"# Constructor: this is run first when you instantiate the SavedScene class\n")
  106. out_file.write(i1+"##########################################################################################################\n")
  107. out_file.write(i1+"def __init__(self,loadmode=1,seParticleEffect=None,seParticles=None,executionpath=None):# loadmode 0 specifies that this file is being loaded by the scene editor and it passes its own versions of the particle fx modules\n")
  108. out_file.write("\n")
  109. out_file.write(i2+"self.loadmode=loadmode\n")
  110. out_file.write(i2+"self.seParticleEffect=seParticleEffect\n")
  111. out_file.write(i2+"self.seParticles=seParticles\n")
  112. out_file.write(i2+"self.executionpath=executionpath\n")
  113. out_file.write("\n")
  114. out_file.write(i2+"base.enableParticles()# Enable Particle effects\n")
  115. out_file.write("\n")
  116. out_file.write(i2+"self.cTrav = CollisionTraverser() # Setup a traverser for collisions\n")
  117. out_file.write(i2+"base.cTrav = self.cTrav\n")
  118. out_file.write(i2+"self.CollisionHandler.setInPattern(\"enter%in\")# The message to be raised when something enters a collision node\n")
  119. out_file.write(i2+"self.CollisionHandler.setOutPattern(\"exit%in\")# The message to be raised when something exits a collision node\n")
  120. out_file.write("\n")
  121. ####################################################################################################################################################
  122. # Save Models
  123. ####################################################################################################################################################
  124. out_file.write(i2+"##########################################################################################################\n")
  125. out_file.write(i2+"# Code for all the models\n")
  126. out_file.write(i2+"# To access these models:\n")
  127. out_file.write(i2+"# theScene.ModelDic[\"'Model_Name\"']\n")
  128. out_file.write(i2+"# where theScene is the SavedScene class instance\n")
  129. out_file.write(i2+"# Properties saved include:\n")
  130. out_file.write(i2+"# Transformations\n")
  131. out_file.write(i2+"# Alpha and color\n")
  132. out_file.write(i2+"# Parent and child information\n")
  133. out_file.write(i2+"##########################################################################################################\n")
  134. for model in AllScene.ModelDic:
  135. out_file.write("\n")
  136. modelS=str(model)
  137. if(1): # This is kept for now... perhaps later some sort of check might have to be enforced based on loadMode
  138. #Loading Code
  139. out_file.write(i2+"# Loading model's egg file\n")
  140. #out_file.write(i2+ "self."+ modelS + "=loader.loadModel(\'" + AllScene.ModelRefDic[model].getFullpath() + "\')\n")#Absolute Paths
  141. newpath = dirname + "/" + AllScene.ModelRefDic[model].getBasename()
  142. newpathF=Filename(newpath)
  143. newpathSpecific=newpathF.toOsSpecific()
  144. # Copy all the textures referenced by this file over to the relative directory
  145. fnamelist=[]
  146. modelData=EggData()
  147. modelData.read(AllScene.ModelRefDic[model])
  148. textures=EggTextureCollection()
  149. textures.findUsedTextures(modelData)
  150. for index in range(textures.getNumTextures()):
  151. texture=textures.getTexture(index)
  152. texfilename=texture.getFilename()
  153. fnamelist.append(texfilename.getFullpath())
  154. oldFilename=Filename(Filename(AllScene.ModelRefDic[model].getDirname()),texfilename)
  155. if(not oldFilename.isRegularFile()):
  156. if(texfilename.resolveFilename(getTexturePath(),"")):
  157. oldFilename=texfilename
  158. oldtexpath=oldFilename.toOsSpecific()
  159. newtexpath=dirname + "/" + texfilename.getBasename()
  160. newtexpathF=Filename(newtexpath)
  161. newtexpathSpecific=newtexpathF.toOsSpecific()
  162. print "TEXTURE SAVER:: copying" + oldtexpath + " to " + newtexpathSpecific
  163. if(oldtexpath != newtexpathSpecific):
  164. shutil.copyfile(oldtexpath,newtexpathSpecific)
  165. # Copy the file over to the relative directory
  166. oldModelpath=AllScene.ModelRefDic[model].toOsSpecific()
  167. print "FILESAVER:: copying from " + AllScene.ModelRefDic[model].toOsSpecific() + "to" + newpathSpecific
  168. if(oldModelpath!=newpathSpecific):
  169. shutil.copyfile(oldModelpath,newpathSpecific)
  170. e=EggData()
  171. e.read(AllScene.ModelRefDic[model])
  172. etc=EggTextureCollection()
  173. etc.extractTextures(e)
  174. for index in range(len(fnamelist)):
  175. print fnamelist[index]
  176. tex=etc.findFilename(Filename(fnamelist[index]))
  177. fn=Filename(tex.getFilename())
  178. fn.setDirname("")
  179. tex.setFilename(fn)
  180. e.writeEgg(Filename.fromOsSpecific(newpathSpecific))
  181. out_file.write(i2+"if(self.loadmode==1):\n")
  182. out_file.write(i2+i1+ "self."+ modelS + "=loader.loadModel(\'" + self.savepath + "/" + AllScene.ModelRefDic[model].getBasename() + "')\n")#Relative Path
  183. out_file.write(i2+"else:\n")
  184. out_file.write(i2+i1+ "self."+ modelS + "=loader.loadModel(self.executionpath + \'/" + AllScene.ModelRefDic[model].getBasename() + "')\n")#Relative Path with execution point specified by the invoking-level-editor
  185. #Transformation Code
  186. out_file.write("\n")
  187. out_file.write(i2+"# Transforming the model\n")
  188. out_file.write(i2+ "self."+ modelS + ".setPosHprScale(%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f)\n"% (AllScene.ModelDic[model].getX(),AllScene.ModelDic[model].getY(),AllScene.ModelDic[model].getZ(),AllScene.ModelDic[model].getH(),AllScene.ModelDic[model].getP(),AllScene.ModelDic[model].getR(),AllScene.ModelDic[model].getSx(),AllScene.ModelDic[model].getSy(),AllScene.ModelDic[model].getSz()))
  189. if(AllScene.ModelDic[model].hasTransparency()):
  190. out_file.write("\n")
  191. out_file.write(i2+"# Alpha\n")
  192. out_file.write(i2+ "self."+ modelS + ".setTransparency(1)\n")
  193. clr=AllScene.ModelDic[model].getColor()
  194. out_file.write(i2+ "self."+ modelS + ".setColor(%.4f,%.4f,%.4f,%.4f)\n"%(clr.getX(),clr.getY(),clr.getZ(),clr.getW()))
  195. out_file.write("\n")
  196. out_file.write(i2+ "# Reparent To Render for now and later we update all the parentings\n")
  197. out_file.write(i2+ "self."+ modelS + ".reparentTo(render)\n")
  198. out_file.write("\n")
  199. out_file.write(i2+ "# Save Metadata...can be retrieved by doing theScene.ModelDic[\"Model_Name\"].getTag(\"Metadata\")\n")
  200. out_file.write(i2+ "self."+ modelS + ".setTag(\"Metadata\",\"" + AllScene.ModelDic[model].getTag("Metadata") + "\")\n")
  201. out_file.write("\n")
  202. out_file.write(i2+ "# Fill in the dictionaries which are used by level Ed to reload state\n")
  203. out_file.write(i2+ "self.ModelDic[\'" + modelS + "\']=self." + AllScene.ModelDic[model].getName()+"\n")
  204. #out_file.write(i2+ "self.ModelRefDic[\'" + modelS + "\']=Filename(\'"+ AllScene.ModelRefDic[model].getFullpath() +"\')\n")# The old Absolute Path way
  205. out_file.write(i2+ "self.ModelRefDic[\'" + modelS + "\']=\'"+ AllScene.ModelRefDic[model].getBasename() +"\'\n")# Relative paths
  206. out_file.write(i2+ "self.ModelDic[\'"+ modelS + "\'].setName(\'"+ modelS +"\')\n")
  207. out_file.write("\n")
  208. ####################################################################################################################################################
  209. # Save Dummies
  210. ####################################################################################################################################################
  211. out_file.write(i2+"##########################################################################################################\n")
  212. out_file.write(i2+"# Code for all the Dummy Objects\n")
  213. out_file.write(i2+"# To access the dummies\n")
  214. out_file.write(i2+"# theScene.dummyDict['Dummy_Name']\n")
  215. out_file.write(i2+"##########################################################################################################\n")
  216. for dummy in AllScene.dummyDict:
  217. out_file.write("\n")
  218. dummyS=str(dummy)
  219. if(1): # This is kept for now... perhaps later some sort of check might have to be enforced based on loadMode
  220. out_file.write(i2+ "self."+ dummyS + "=loader.loadModel(\"models/misc/sphere\")\n")
  221. #Transformation Code
  222. out_file.write(i2+"# Transforming the Dummy\n")
  223. out_file.write(i2+ "self."+ dummyS + ".setPosHprScale(%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f)\n"% (AllScene.dummyDict[dummy].getX(),AllScene.dummyDict[dummy].getY(),AllScene.dummyDict[dummy].getZ(),AllScene.dummyDict[dummy].getH(),AllScene.dummyDict[dummy].getP(),AllScene.dummyDict[dummy].getR(),AllScene.dummyDict[dummy].getSx(),AllScene.dummyDict[dummy].getSy(),AllScene.dummyDict[dummy].getSz()))
  224. out_file.write("\n")
  225. out_file.write(i2+ "# Fill in the dictionaries which are used by level Ed to reload state\n")
  226. out_file.write(i2+ "self.dummyDict[\'" + dummyS + "\']=self." + AllScene.dummyDict[dummy].getName()+"\n")
  227. out_file.write(i2+ "self.dummyDict[\'"+ dummyS + "\'].setName(\'"+ dummyS +"\')\n")
  228. out_file.write("\n")
  229. out_file.write(i2+ "# Save Metadata...can be retrieved by doing theScene.dummyDict[\"Dummy_Name\"].getTag(\"Metadata\")\n")
  230. out_file.write(i2+ "self."+ dummyS + ".setTag(\"Metadata\",\"" + AllScene.dummyDict[dummy].getTag("Metadata") + "\")\n")
  231. out_file.write("\n")
  232. ####################################################################################################################################################
  233. # Saving Actors and their animations
  234. ####################################################################################################################################################
  235. out_file.write(i2+"##########################################################################################################\n")
  236. out_file.write(i2+"# Code for all the Actors and animations\n")
  237. out_file.write(i2+"# To access the Actors\n")
  238. out_file.write(i2+"# theScene.ActorDic[\'Actor_Name\']\n")
  239. out_file.write(i2+"# theScene.ActorDic[\'Actor_Name\'].play(\'Animation_Name\')\n")
  240. out_file.write(i2+"##########################################################################################################\n")
  241. for actor in AllScene.ActorDic:
  242. out_file.write("\n")
  243. actorS=str(actor)
  244. if(1): # This is kept for now... perhaps later some sort of check might have to be enforced based on loadMode
  245. #out_file.write(i2+ "self."+ actorS + "=Actor.Actor(\'"+ AllScene.ActorRefDic[actor].getFullpath() + "\')\n")# The old way with absolute paths
  246. newpath = dirname + "/" + AllScene.ActorRefDic[actor].getBasename()
  247. newpathF=Filename(newpath)
  248. newpathSpecific=newpathF.toOsSpecific()
  249. # Copy all the textures referenced by this file over to the relative directory
  250. actorfnamelist=[]
  251. actorData=EggData()
  252. actorData.read(AllScene.ActorRefDic[actor])
  253. textures=EggTextureCollection()
  254. textures.findUsedTextures(actorData)
  255. for index in range(textures.getNumTextures()):
  256. texture=textures.getTexture(index)
  257. texfilename=texture.getFilename()
  258. actorfnamelist.append(texfilename.getFullpath())
  259. oldFilename=Filename(Filename(AllScene.ActorRefDic[actor].getDirname()),texfilename)
  260. if(not oldFilename.isRegularFile()):
  261. if(texfilename.resolveFilename(getTexturePath(),"")):
  262. oldFilename=texfilename
  263. oldtexpath=oldFilename.toOsSpecific()
  264. newtexpath=dirname + "/" + texfilename.getBasename()
  265. newtexpathF=Filename(newtexpath)
  266. newtexpathSpecific=newtexpathF.toOsSpecific()
  267. print "TEXTURE SAVER:: copying" + oldtexpath + " to " + newtexpathSpecific
  268. if(oldtexpath != newtexpathSpecific):
  269. shutil.copyfile(oldtexpath,newtexpathSpecific)
  270. # Copy the file over to the relative directory
  271. oldActorpath=AllScene.ActorRefDic[actor].toOsSpecific()
  272. print "FILESAVER:: copying from " + AllScene.ActorRefDic[actor].toOsSpecific() + "to" + newpathSpecific
  273. if(oldActorpath!=newpathSpecific):
  274. shutil.copyfile(oldActorpath,newpathSpecific)
  275. e=EggData()
  276. e.read(AllScene.ActorRefDic[actor])
  277. etc=EggTextureCollection()
  278. etc.extractTextures(e)
  279. for index in range(len(actorfnamelist)):
  280. print actorfnamelist[index]
  281. tex=etc.findFilename(Filename(actorfnamelist[index]))
  282. fn=Filename(tex.getFilename())
  283. fn.setDirname("")
  284. tex.setFilename(fn)
  285. e.writeEgg(Filename.fromOsSpecific(newpathSpecific))
  286. out_file.write(i2+"if(self.loadmode==1):\n")
  287. out_file.write(i2+i1+ "self."+ actorS + "=Actor.Actor(\'" + self.savepath + "/" + AllScene.ActorRefDic[actor].getBasename() + "')\n")#Relative Path
  288. out_file.write(i2+"else:\n")
  289. out_file.write(i2+i1+ "self."+ actorS + "=Actor.Actor(self.executionpath + \'/" + AllScene.ActorRefDic[actor].getBasename() + "')\n")#Relative Path with execution point specified by the invoking-level-editor
  290. #Transformation Code
  291. out_file.write(i2+"# Transforming the Actor\n")
  292. out_file.write(i2+ "self."+ actorS + ".setPosHprScale(%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f)\n"% (AllScene.ActorDic[actor].getX(),AllScene.ActorDic[actor].getY(),AllScene.ActorDic[actor].getZ(),AllScene.ActorDic[actor].getH(),AllScene.ActorDic[actor].getP(),AllScene.ActorDic[actor].getR(),AllScene.ActorDic[actor].getSx(),AllScene.ActorDic[actor].getSy(),AllScene.ActorDic[actor].getSz()))
  293. if(AllScene.ActorDic[actor].hasTransparency()):
  294. out_file.write(i2+"# Alpha\n")
  295. out_file.write(i2+ "self."+ actorS + ".setTransparency(1)\n")
  296. clr=AllScene.ActorDic[actor].getColor()
  297. out_file.write(i2+ "self."+ actorS + ".setColor(%.4f,%.4f,%.4f,%.4f)\n"%(clr.getX(),clr.getY(),clr.getZ(),clr.getW()))
  298. out_file.write(i2+ "self."+ actorS + ".reparentTo(render)\n")
  299. out_file.write("\n")
  300. out_file.write(i2+ "# Save Metadata...can be retrieved by doing theScene.ActorDic[\"Actor_Name\"].getTag(\"Metadata\")\n")
  301. out_file.write(i2+ "self."+ actorS + ".setTag(\"Metadata\",\"" + AllScene.ActorDic[actor].getTag("Metadata") + "\")\n")
  302. out_file.write("\n")
  303. out_file.write(i2+ "# Fill in the dictionaries which are used by level Ed to reload state\n")
  304. ActorAnimations=AllScene.getAnimationDictFromActor(actor)
  305. ActorAnimationsInvoke={}
  306. if(ActorAnimations!={}): #Check if a dictionary of animations exists for this actor
  307. for animation in ActorAnimations:
  308. #out_file.write(i2+ "self."+ actorS + ".loadAnims(" + str(ActorAnimations) +")\n") # Old way with absolute paths
  309. #Manakel 2/12/2004: solve the not empty but not defined animation case
  310. if not animation is None:
  311. print "ACTOR ANIMATIONS:" + ActorAnimations[animation]
  312. oldAnimPath=Filename(ActorAnimations[animation])
  313. oldAnim=oldAnimPath.toOsSpecific()
  314. dirOS=Filename(dirname)
  315. newAnim=dirOS.toOsSpecific() + "\\" + oldAnimPath.getBasename()
  316. print "ACTOR ANIM SAVER:: Comparing" + oldAnim +"and" + newAnim
  317. if(oldAnim!=newAnim):
  318. shutil.copyfile(oldAnim,newAnim)
  319. newAnimF=Filename.fromOsSpecific(newAnim)
  320. ActorAnimationsInvoke[animation]="self.executionpath +" + "/" +newAnimF.getBasename()
  321. ActorAnimations[animation]= self.savepath + "/" + newAnimF.getBasename()
  322. out_file.write(i2+"if(self.loadmode==1):\n")
  323. out_file.write(i2+ i1+"self."+ actorS + ".loadAnims(" + str(ActorAnimations) +")\n") # Now with new relative paths
  324. out_file.write(i2+"else:\n")
  325. theloadAnimString=str(ActorAnimationsInvoke)# We hack the "self.executionpath" part into the dictionary as a variable using string replace
  326. print "LOAD ANIM STRING BEFORE" + theloadAnimString
  327. theloadAnimString=theloadAnimString.replace('\'self.executionpath +','self.executionpath + \'')
  328. print "LOAD ANIM STRING AFTER" + theloadAnimString
  329. out_file.write(i2+ i1+"self."+ actorS + ".loadAnims(" + theloadAnimString +")\n") # Now with new relative paths based on editor invocation
  330. out_file.write(i2+ "self.ActorDic[\'" + actorS + "\']=self." + AllScene.ActorDic[actor].getName()+"\n")
  331. #out_file.write(i2+ "self.ActorRefDic[\'" + actorS + "\']=Filename(\'"+AllScene.ActorRefDic[actor].getFullpath() +"\')\n") # Old way with absolute paths
  332. out_file.write(i2+ "self.ActorRefDic[\'" + actorS + "\']=\'"+ AllScene.ActorRefDic[actor].getBasename() +"\'\n")# Relative paths
  333. out_file.write(i2+ "self.ActorDic[\'"+ actorS + "\'].setName(\'"+ actorS +"\')\n")
  334. if(AllScene.blendAnimDict.has_key(actor)): # Check if a dictionary of blended animations exists
  335. out_file.write(i2+ "self.blendAnimDict[\"" + actorS +"\"]=" + str(AllScene.blendAnimDict[actor]) + "\n")
  336. out_file.write("\n")
  337. ####################################################################################################################################################
  338. # Collsion Node Saving
  339. ####################################################################################################################################################
  340. out_file.write(i2+"##########################################################################################################\n")
  341. out_file.write(i2+"# Code for setting up Collision Nodes\n")
  342. out_file.write(i2+"# To use collision detection:\n")
  343. out_file.write(i2+"# You must set up your own bitmasking and event handlers, the traverser \"cTrav\" is created for you at the top\n")
  344. out_file.write(i2+"# The collision nodes are stored in collisionDict\n")
  345. out_file.write(i2+"##########################################################################################################\n\n")
  346. for collnode in AllScene.collisionDict:
  347. collnodeS=str(collnode)
  348. solid=AllScene.collisionDict[collnode].node().getSolid(0)
  349. nodetype=solid.getType().getName()
  350. if(nodetype=="CollisionSphere"): #Save Collison Sphere
  351. out_file.write(i2+"collSolid=CollisionSphere(%.3f,%.3f,%.3f,%.3f)\n"%(solid.getCenter().getX(),solid.getCenter().getY(),solid.getCenter().getZ(),solid.getRadius()))
  352. pass
  353. elif(nodetype=="CollisionPolygon"): #Save Collison Polygon
  354. ax=AllScene.collisionDict[collnode].getTag("A_X")
  355. ay=AllScene.collisionDict[collnode].getTag("A_Y")
  356. az=AllScene.collisionDict[collnode].getTag("A_Z")
  357. bx=AllScene.collisionDict[collnode].getTag("B_X")
  358. by=AllScene.collisionDict[collnode].getTag("B_Y")
  359. bz=AllScene.collisionDict[collnode].getTag("B_Z")
  360. cx=AllScene.collisionDict[collnode].getTag("C_X")
  361. cy=AllScene.collisionDict[collnode].getTag("C_Y")
  362. cz=AllScene.collisionDict[collnode].getTag("C_Z")
  363. out_file.write(i2+"pointA = Point3(" + ax + "," + ay + "," + az + ")\n")
  364. out_file.write(i2+"pointB = Point3(" + bx + "," + by + "," + bz + ")\n")
  365. out_file.write(i2+"pointC = Point3(" + cx + "," + cy + "," + cz + ")\n")
  366. out_file.write(i2+"collSolid=CollisionPolygon(pointA, pointB, pointC)\n")
  367. pass
  368. elif(nodetype=="CollisionSegment"): #Save Collison Segment
  369. A=AllScene.collisionDict[collnode].node().getSolid(0).getPointA()
  370. B=AllScene.collisionDict[collnode].node().getSolid(0).getPointB()
  371. out_file.write(i2+"pointA = Point3(%.3f,%.3f,%.3f)\n"%(A.getX(),A.getY(),A.getZ()))
  372. out_file.write(i2+"pointB = Point3(%.3f,%.3f,%.3f)\n"%(B.getX(),B.getY(),B.getZ()))
  373. out_file.write(i2+"collSolid=CollisionSegment()\n")
  374. out_file.write(i2+"collSolid.setPointA(pointA)\n")
  375. out_file.write(i2+"collSolid.setFromLens(base.cam.node(),Point2(-1,1))\n")
  376. out_file.write(i2+"collSolid.setPointB(pointB)\n")
  377. pass
  378. elif(nodetype=="CollisionRay"): #Save Collison Ray
  379. P = AllScene.collisionDict[collnode].node().getSolid(0).getOrigin()
  380. V = AllScene.collisionDict[collnode].node().getSolid(0).getDirection()
  381. out_file.write(i2+"point=Point3(%.3f,%.3f,%.3f)\n"%(P.getX(),P.getY(),P.getZ()))
  382. out_file.write(i2+"vector=Vec3(%.3f,%.3f,%.3f)\n"%(V.getX(),V.getY(),V.getZ()))
  383. out_file.write(i2+"collSolid=CollisionRay()\n")
  384. out_file.write(i2+"collSolid.setOrigin(point)\n")
  385. out_file.write(i2+"collSolid.setDirection(vector)\n")
  386. pass
  387. else:
  388. print "Invalid Collision Node: " + nodetype
  389. out_file.write("\n")
  390. out_file.write(i2+"self." + collnodeS + "_Node" + "=CollisionNode(\""+collnodeS+"\")\n")
  391. out_file.write(i2+"self." + collnodeS + "_Node" + ".addSolid(collSolid)\n")
  392. out_file.write(i2+"base.cTrav.addCollider(self." + collnodeS + "_Node,self.CollisionHandler)\n")
  393. out_file.write("\n")
  394. ####################################################################################################################################################
  395. # Light Saving
  396. ####################################################################################################################################################
  397. out_file.write(i2+"##########################################################################################################\n")
  398. out_file.write(i2+"# Code for Lighting\n")
  399. out_file.write(i2+"# To manipulated lights:\n")
  400. out_file.write(i2+"# Manipulate the light node in theScene.LightNodes[\'Light_Name\']\n")
  401. out_file.write(i2+"##########################################################################################################\n\n")
  402. LightList=AllScene.lightManager.getLightNodeList()
  403. for light in LightList:
  404. type = light.getType()
  405. if type == 'ambient':
  406. out_file.write(i2+"# Ambient Light\n")
  407. out_file.write (i2+ "self.ambientCount += 1\n")
  408. out_file.write (i2+ "alight = AmbientLight(\'"+ light.getName() +"\')\n")
  409. out_file.write (i2+ "alight.setColor(VBase4("+ str(light.getLightColor().getX())+ "," + str(light.getLightColor().getY())+ "," + str(light.getLightColor().getZ()) + "," + str(light.getLightColor().getW()) + "))\n")
  410. out_file.write (i2+ "self.lightAttrib=self.lightAttrib.addLight(alight)\n")
  411. out_file.write (i2+ "self."+light.getName()+"= render.attachNewNode(alight.upcastToPandaNode())\n")
  412. out_file.write (i2+ "self."+light.getName()+".setTag(\"Metadata\",\"" + light.getTag("Metadata") + "\")\n")
  413. out_file.write (i2+ "self.LightDict[\'" + light.getName() + "\']=alight\n")
  414. out_file.write (i2+ "self.LightTypes[\'" + light.getName() + "\']=\'" + type + "\'\n")
  415. out_file.write (i2+ "self.LightNodes[\'" + light.getName() + "\']=self." + light.getName() + "\n")
  416. out_file.write ("\n")
  417. elif type == 'directional':
  418. out_file.write(i2+"# Directional Light\n")
  419. out_file.write (i2+ "self.directionalCount += 1\n")
  420. out_file.write (i2+ "alight = DirectionalLight(\'"+ light.getName() + "\')\n")
  421. out_file.write (i2+ "alight.setColor(VBase4("+ str(light.getLightColor().getX())+ "," + str(light.getLightColor().getY())+ "," + str(light.getLightColor().getZ()) + "," + str(light.getLightColor().getW()) + "))\n")
  422. #out_file.write (i2+ "alight.setDirection(Vec3("+ str(light.getH())+ "," + str(light.getP())+ "," + str(light.getR()) + "))\n")
  423. #out_file.write (i2+ "alight.setPoint(Point3(" + str(light.getX()) + "," + str(light.getY()) + "," + str(light.getZ()) + "))\n")
  424. out_file.write (i2+ "alight.setSpecularColor(Vec4(" + str(light.getSpecColor().getX()) + "," + str(light.getSpecColor().getY()) + "," + str(light.getSpecColor().getZ()) + "," + str(light.getSpecColor().getW()) + "))\n")
  425. out_file.write (i2+ "self.lightAttrib=self.lightAttrib.addLight(alight)\n")
  426. out_file.write (i2+ "self."+light.getName()+ "= render.attachNewNode(alight.upcastToPandaNode())\n")
  427. out_file.write (i2+ "self."+light.getName()+ ".setPos(Point3(" + str(light.getX()) + "," + str(light.getY()) + "," + str(light.getZ()) + "))\n")
  428. out_file.write (i2+ "self."+light.getName()+ ".setHpr(Vec3("+ str(light.getH())+ "," + str(light.getP())+ "," + str(light.getR()) + "))\n")
  429. out_file.write (i2+ "self."+light.getName()+ ".setTag(\"Metadata\",\"" + light.getTag("Metadata") + "\")\n")
  430. #out_file.write (i2+ "alight.setPos
  431. out_file.write (i2+ "self.LightDict[\'" + light.getName() + "\']=alight\n")
  432. out_file.write (i2+ "self.LightTypes[\'" + light.getName() + "\']=\'" + type + "\'\n")
  433. out_file.write (i2+ "self.LightNodes[\'" + light.getName() + "\']=self." + light.getName() + "\n")
  434. out_file.write ("\n")
  435. elif type == 'point':
  436. out_file.write(i2+"# Point Light\n")
  437. out_file.write (i2+ "self.pointCount += 1\n")
  438. out_file.write (i2+ "alight = PointLight(\'"+ light.getName() +"\')\n")
  439. out_file.write (i2+ "alight.setColor(VBase4("+ str(light.getLightColor().getX())+ "," + str(light.getLightColor().getY())+ "," + str(light.getLightColor().getZ()) + "," + str(light.getLightColor().getW()) + "))\n")
  440. #out_file.write (i2+ "alight.setPoint(Point3(" + str(light.getX()) + "," + str(light.getY()) + "," + str(light.getZ()) + "))\n")
  441. out_file.write (i2+ "alight.setSpecularColor(Vec4(" + str(light.getSpecColor().getX()) + "," + str(light.getSpecColor().getY()) + "," + str(light.getSpecColor().getZ()) + "," + str(light.getSpecColor().getW()) + "))\n")
  442. out_file.write (i2+ "alight.setAttenuation(Vec3("+ str(light.getAttenuation().getX()) + "," + str(light.getAttenuation().getY()) + "," + str(light.getAttenuation().getZ()) + "))\n")
  443. out_file.write (i2+ "self.lightAttrib=self.lightAttrib.addLight(alight)\n")
  444. out_file.write (i2+ "self."+light.getName()+ "= render.attachNewNode(alight.upcastToPandaNode())\n")
  445. out_file.write (i2+ "self."+light.getName()+ ".setTag(\"Metadata\",\"" + light.getTag("Metadata") + "\")\n")
  446. out_file.write (i2+ "self."+light.getName()+ ".setPos(Point3(" + str(light.getX()) + "," + str(light.getY()) + "," + str(light.getZ()) + "))\n")
  447. out_file.write (i2+ "self.LightDict[\'" + light.getName() + "\']=alight\n")
  448. out_file.write (i2+ "self.LightTypes[\'" + light.getName() + "\']=\'" + type + "\'\n")
  449. out_file.write (i2+ "self.LightNodes[\'" + light.getName() + "\']=self." + light.getName() + "\n")
  450. out_file.write ("\n")
  451. elif type == 'spot':
  452. out_file.write(i2+"# Spot Light\n")
  453. out_file.write (i2+ "self.spotCount += 1\n")
  454. out_file.write (i2+ "alight = Spotlight(\'"+ light.getName() + "\')\n")
  455. out_file.write (i2+ "alight.setColor(VBase4("+ str(light.getLightColor().getX())+ "," + str(light.getLightColor().getY())+ "," + str(light.getLightColor().getZ()) + "," + str(light.getLightColor().getW()) + "))\n")
  456. out_file.write (i2+ "alens = PerspectiveLens()\n")
  457. out_file.write (i2+ "alight.setLens(alens)\n")
  458. out_file.write (i2+ "alight.setSpecularColor(Vec4(" + str(light.getSpecColor().getX()) + "," + str(light.getSpecColor().getY()) + "," + str(light.getSpecColor().getZ()) + "," + str(light.getSpecColor().getW()) + "))\n")
  459. out_file.write (i2+ "alight.setAttenuation(Vec3("+ str(light.getAttenuation().getX()) + "," + str(light.getAttenuation().getY()) + "," + str(light.getAttenuation().getZ()) + "))\n")
  460. out_file.write (i2+ "alight.setExponent(" +str(light.getExponent()) +")\n")
  461. out_file.write (i2+ "self.lightAttrib=self.lightAttrib.addLight(alight)\n")
  462. out_file.write (i2+ "self."+light.getName()+ "= render.attachNewNode(alight.upcastToLensNode())\n")
  463. out_file.write (i2+ "self."+light.getName()+ ".setTag(\"Metadata\",\"" + light.getTag("Metadata") + "\")\n")
  464. out_file.write (i2+ "self."+light.getName()+ ".setPos(Point3(" + str(light.getX()) + "," + str(light.getY()) + "," + str(light.getZ()) + "))\n")
  465. out_file.write (i2+ "self."+light.getName()+ ".setHpr(Vec3("+ str(light.getH())+ "," + str(light.getP())+ "," + str(light.getR()) + "))\n")
  466. out_file.write (i2+ "self.LightDict[\'" + light.getName() + "\']=alight\n")
  467. out_file.write (i2+ "self.LightTypes[\'" + light.getName() + "\']=\'" + type + "\'\n")
  468. out_file.write (i2+ "self.LightNodes[\'" + light.getName() + "\']=self." + light.getName() + "\n")
  469. out_file.write ("\n")
  470. else:
  471. out_file.write (i2+ "print \'Invalid light type\'")
  472. out_file.write (i2+ "return None")
  473. out_file.write("\n")
  474. ####################################################################################################################################################
  475. # Enable Lighting
  476. ####################################################################################################################################################
  477. out_file.write(i2+ "# Enable Ligthing\n")
  478. out_file.write(i2+ "render.node().setAttrib(self.lightAttrib)\n")
  479. out_file.write("\n")
  480. ####################################################################################################################################################
  481. # Initialize Particles for non scene editor mode
  482. ####################################################################################################################################################
  483. out_file.write(i2+"# Load Particle Effects. The parameters to this function are to allow us to use our modified versions of the Particle Effects modules when loading this file with the level editor\n")
  484. out_file.write(i2+"self.starteffects(self.loadmode,self.seParticleEffect,self.seParticles)\n")
  485. out_file.write("\n")
  486. ####################################################################################################################################################
  487. # Save Camera Settings
  488. ####################################################################################################################################################
  489. out_file.write("\n")
  490. out_file.write(i2+ "# Save Camera Settings\n")
  491. out_file.write(i2+ "camera.setX(" + str(camera.getX()) + ")\n")
  492. out_file.write(i2+ "camera.setY(" + str(camera.getY()) + ")\n")
  493. out_file.write(i2+ "camera.setZ(" + str(camera.getZ()) + ")\n")
  494. out_file.write(i2+ "camera.setH(" + str(camera.getH()) + ")\n")
  495. out_file.write(i2+ "camera.setP(" + str(camera.getP()) + ")\n")
  496. out_file.write(i2+ "camera.setR(" + str(camera.getR()) + ")\n")
  497. out_file.write(i2+ "camera.getChild(0).node().getLens().setNear(" + str(camera.getChild(0).node().getLens().getNear()) + ")\n")
  498. out_file.write(i2+ "camera.getChild(0).node().getLens().setFar(" + str(camera.getChild(0).node().getLens().getFar()) + ")\n")
  499. out_file.write(i2+ "camera.getChild(0).node().getLens().setFov(VBase2(%.5f,%.5f))\n"% (camera.getChild(0).node().getLens().getHfov(),camera.getChild(0).node().getLens().getVfov()))
  500. FilmSize=camera.getChild(0).node().getLens().getFilmSize()
  501. out_file.write(i2+ "camera.getChild(0).node().getLens().setFilmSize(%.3f,%.3f)\n"%(FilmSize.getX(),FilmSize.getY()))
  502. out_file.write(i2+ "camera.getChild(0).node().getLens().setFocalLength(" + str(camera.getChild(0).node().getLens().getFocalLength()) + ")\n")
  503. out_file.write(i2+ "camera.setTag(\"Metadata\",\"" + camera.getTag("Metadata") + "\")\n")
  504. out_file.write(i2+ "camera.reparentTo(render)\n")
  505. out_file.write(i2+ "base.disableMouse()\n")
  506. self.bgColor=base.getBackgroundColor()
  507. out_file.write(i2+ "base.setBackgroundColor(%.3f,%.3f,%.3f)\n"%(self.bgColor.getX(),self.bgColor.getY(),self.bgColor.getZ()))
  508. out_file.write("\n")
  509. ####################################################################################################################################################
  510. # Mopath Saving
  511. ####################################################################################################################################################
  512. out_file.write(i2+"##########################################################################################################\n")
  513. out_file.write(i2+"# Motion Paths\n")
  514. out_file.write(i2+"# Using Mopaths:\n")
  515. out_file.write(i2+"# theScene.curveIntervals[0].start() or .loop() will play curve with index 0\n")
  516. out_file.write(i2+"##########################################################################################################\n\n")
  517. for node in AllScene.curveDict:
  518. curveCollection=AllScene.curveDict[node]
  519. curvenumber=0
  520. for curve in curveCollection:
  521. filestring=dirname+ "\\" + str(node)+"_curve_"+str(curvenumber)+".egg"
  522. f=Filename.fromOsSpecific(filestring)
  523. #filestring=f.getFullpath()# The old absolute path way
  524. filestring=f.getBasename() # The new relative path way
  525. curve.writeEgg(f)
  526. out_file.write(i2+"m=Mopath.Mopath()\n")
  527. out_file.write(i2+"if(self.loadmode==1):\n")
  528. out_file.write(i2+i1+"m.loadFile(\"" + self.savepath +"/"+ filestring + "\")\n") # If just normally executed
  529. out_file.write(i2+"else:\n")
  530. out_file.write(i2+i1+"m.loadFile(self.executionpath + \"/"+ filestring + "\")\n") # If being invoked by level Ed
  531. out_file.write(i2+"mp=MopathInterval(m,self." + str(node) + ")\n")
  532. out_file.write(i2+"self.curveIntervals.append(mp)\n")
  533. out_file.write(i2+"if(self.loadmode==1):\n")
  534. out_file.write(i2+i1+"self.curveRefColl.append(\"" + self.savepath +"/"+ filestring +"\")\n")
  535. out_file.write(i2+"else:\n")
  536. out_file.write(i2+i1+"self.curveRefColl.append(self.executionpath + \"/"+ filestring +"\")\n")
  537. curvenumber=curvenumber+1
  538. out_file.write(i2+"self.curveIntervalsDict[\"" + str(node) + "\"]=self.curveIntervals\n")
  539. out_file.write(i2+"self.curveDict[\"" + str(node) + "\"]=self.curveRefColl\n")
  540. ####################################################################################################################################################
  541. # Lets do all the reparenting here so as to make sure everything that needed to load was loaded
  542. ####################################################################################################################################################
  543. out_file.write(i2+"##########################################################################################################\n")
  544. out_file.write(i2+"# Reparenting\n")
  545. out_file.write(i2+"# A final pass is done on setting all the scenegraph hierarchy after all objects are laoded\n")
  546. out_file.write(i2+"##########################################################################################################\n\n")
  547. for model in AllScene.ModelDic:
  548. modelS=str(model)
  549. parent=AllScene.ModelDic[model].getParent().getName()
  550. if(parent=="render" or parent=="camera"):
  551. out_file.write(i2+ "self."+ modelS + ".reparentTo(" + parent + ")\n")
  552. else:
  553. if(AllScene.particleDict.has_key(parent)):
  554. out_file.write(i2+ "self."+ modelS + ".reparentTo(self." + parent + ".getEffect())\n")
  555. else:
  556. out_file.write(i2+ "self."+ modelS + ".reparentTo(self." + parent + ")\n")
  557. out_file.write(i2+ "self.ModelDic[\'" + modelS + "\']=self." + AllScene.ModelDic[model].getName()+"\n")
  558. out_file.write(i2+"\n")
  559. for dummy in AllScene.dummyDict:
  560. dummyS=str(dummy)
  561. parent=AllScene.dummyDict[dummy].getParent().getName()
  562. if(parent=="render" or parent=="camera"):
  563. out_file.write(i2+ "self."+ dummyS + ".reparentTo(" + parent + ")\n")
  564. else:
  565. if(AllScene.particleDict.has_key(parent)):
  566. out_file.write(i2+ "self."+ dummyS + ".reparentTo(self." + parent + ".getEffect())\n")
  567. else:
  568. out_file.write(i2+ "self."+ dummyS + ".reparentTo(self." + parent + ")\n")
  569. out_file.write(i2+ "self.dummyDict[\'" + dummyS + "\']=self." + AllScene.dummyDict[dummy].getName()+"\n")
  570. out_file.write(i2+"\n")
  571. for actor in AllScene.ActorDic:
  572. actorS=str(actor)
  573. parent=AllScene.ActorDic[actor].getParent().getName()
  574. if(parent=="render" or parent=="camera"):
  575. out_file.write(i2+ "self."+ actorS + ".reparentTo(" + parent + ")\n")
  576. else:
  577. if(AllScene.particleDict.has_key(parent)):
  578. out_file.write(i2+ "self."+ actorS + ".reparentTo(self." + parent + ".getEffect())\n")
  579. else:
  580. out_file.write(i2+ "self."+ actorS + ".reparentTo(self." + parent + ")\n")
  581. out_file.write(i2+ "self.ActorDic[\'" + actorS + "\']=self." + AllScene.ActorDic[actor].getName()+"\n")
  582. out_file.write(i2+"\n")
  583. for collnode in AllScene.collisionDict:
  584. collnodeS=str(collnode)
  585. solid=AllScene.collisionDict[collnode].node().getSolid(0)
  586. nodetype=solid.getType().getName()
  587. parentname=AllScene.collisionDict[collnode].getParent().getName()
  588. if(parentname=="render" or parentname =="camera"):
  589. out_file.write(i2+"self.collisionDict[\"" + collnodeS + "\"]="+ parentname + ".attachNewNode(self." + collnodeS + "_Node)\n")
  590. else:
  591. #Manakel 2/12/2005: parent replaced by parent Name but why Parent name in partice and parent for other objects?
  592. if(AllScene.particleDict.has_key(parentname)):
  593. out_file.write(i2+"self.collisionDict[\"" + collnodeS + "\"]=self."+ parentname + "getEffect().attachNewNode(self." + collnodeS + "_Node)\n")
  594. else:
  595. out_file.write(i2+"self.collisionDict[\"" + collnodeS + "\"]=self."+ parentname + ".attachNewNode(self." + collnodeS + "_Node)\n")
  596. dictelem=AllScene.collisionDict[collnode]
  597. out_file.write(i2+"self.collisionDict[\"" + collnodeS + "\"].setPosHprScale(%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f)\n"%(dictelem.getX(),dictelem.getY(),dictelem.getZ(),dictelem.getH(),dictelem.getP(),dictelem.getR(),dictelem.getSx(),dictelem.getSy(),dictelem.getSz()))
  598. out_file.write(i2+"self.collisionDict[\"" + collnodeS + "\"].setTag(\"Metadata\",\"" + AllScene.collisionDict[collnode].getTag("Metadata") + "\")\n")
  599. out_file.write(i2+"self.collisionDict[\"" + collnodeS + "\"].show()\n")
  600. if(nodetype=="CollisionPolygon"): #Save Collison Polygon... the reason we need to use setTag here is because there is no inbuilt way of saving transforms for collision polys
  601. ax=float(AllScene.collisionDict[collnode].getTag("A_X"))
  602. ay=float(AllScene.collisionDict[collnode].getTag("A_Y"))
  603. az=float(AllScene.collisionDict[collnode].getTag("A_Z"))
  604. bx=float(AllScene.collisionDict[collnode].getTag("B_X"))
  605. by=float(AllScene.collisionDict[collnode].getTag("B_Y"))
  606. bz=float(AllScene.collisionDict[collnode].getTag("B_Z"))
  607. cx=float(AllScene.collisionDict[collnode].getTag("C_X"))
  608. cy=float(AllScene.collisionDict[collnode].getTag("C_Y"))
  609. cz=float(AllScene.collisionDict[collnode].getTag("C_Z"))
  610. out_file.write(i2+"pointA=Point3(%.3f,%.3f,%.3f)\n"%(ax,ay,az))
  611. out_file.write(i2+"pointB=Point3(%.3f,%.3f,%.3f)\n"%(bx,by,bz))
  612. out_file.write(i2+"pointC=Point3(%.3f,%.3f,%.3f)\n"%(cx,cy,cz))
  613. out_file.write(i2+"self.collisionDict[\"" + collnodeS + "\"].setTag('A_X','%f'%pointA.getX())\n")
  614. out_file.write(i2+"self.collisionDict[\"" + collnodeS + "\"].setTag('A_Y','%f'%pointA.getY())\n")
  615. out_file.write(i2+"self.collisionDict[\"" + collnodeS + "\"].setTag('A_Z','%f'%pointA.getZ())\n")
  616. out_file.write(i2+"self.collisionDict[\"" + collnodeS + "\"].setTag('B_X','%f'%pointB.getX())\n")
  617. out_file.write(i2+"self.collisionDict[\"" + collnodeS + "\"].setTag('B_Y','%f'%pointB.getY())\n")
  618. out_file.write(i2+"self.collisionDict[\"" + collnodeS + "\"].setTag('B_Z','%f'%pointB.getZ())\n")
  619. out_file.write(i2+"self.collisionDict[\"" + collnodeS + "\"].setTag('C_X','%f'%pointC.getX())\n")
  620. out_file.write(i2+"self.collisionDict[\"" + collnodeS + "\"].setTag('C_Y','%f'%pointC.getY())\n")
  621. out_file.write(i2+"self.collisionDict[\"" + collnodeS + "\"].setTag('C_Z','%f'%pointC.getZ())\n")
  622. out_file.write(i2+"\n")
  623. for effect in AllScene.particleDict:
  624. parent=AllScene.particleNodes[effect].getParent().getName()
  625. if(parent=="render" or parent=="camera"):
  626. out_file.write(i2+"self.particleDict[\""+ str(effect) +"\"].reparentTo(" + parent + ")\n")
  627. else:
  628. out_file.write(i2+"self.particleDict[\""+ str(effect) +"\"].reparentTo(self." + parent + ")\n")
  629. out_file.write(i2+"\n")
  630. ####################################################################################################################################################
  631. # Particle Saving
  632. ####################################################################################################################################################
  633. out_file.write("\n")
  634. out_file.write(i2+"##########################################################################################################\n")
  635. out_file.write(i2+"# Particle Effects\n")
  636. out_file.write(i2+"# Using Particles:\n")
  637. out_file.write(i2+"# theScene.enableeffect(\"Effect_Name\")\n")
  638. out_file.write(i2+"##########################################################################################################\n\n")
  639. out_file.write(i1+"def starteffects(self,mode,seParticleEffect=None,seParticles=None):\n")
  640. for effect in AllScene.particleDict:
  641. effectS=str(effect)
  642. out_file.write(i2+ "self." + effectS + "=" + effectS + "(mode,seParticleEffect,seParticles)\n")
  643. out_file.write(i2+ "effect=self."+ effectS + ".getEffect()\n")
  644. out_file.write(i2+ "self.particleDict[\"" + effectS + "\"]=effect\n")
  645. out_file.write(i2+ "effect.reparentTo(render)\n")
  646. thenode=AllScene.particleNodes[effect]
  647. out_file.write(i2+ "self.particleDict[\"" + effectS + "\"].setPosHprScale(%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f)\n"%(thenode.getX(),thenode.getY(),thenode.getZ(),thenode.getH(),thenode.getP(),thenode.getR(),thenode.getSx(),thenode.getSy(),thenode.getSz()))
  648. out_file.write("\n")
  649. out_file.write(i2+"return\n")
  650. out_file.write("\n")
  651. out_file.write(i1+"def enableeffect(self,effect_name):\n")
  652. out_file.write(i2+"self.particleDict[effect_name].enable()\n")
  653. out_file.write(i2+"return\n")
  654. out_file.write("\n")
  655. out_file.write(i1+"def disableeffect(self,effect_name):\n")
  656. out_file.write(i2+"self.particleDict[effect_name].disable()\n")
  657. out_file.write(i2+"return\n")
  658. out_file.write("\n")
  659. ####################################################################################################################################################
  660. # Animation Blending Methods
  661. ####################################################################################################################################################
  662. out_file.write("\n")
  663. out_file.write(i2+"##########################################################################################################\n")
  664. out_file.write(i2+"# Animation Blending\n")
  665. out_file.write(i2+"# Using blending:\n")
  666. out_file.write(i2+"# theScene.playBlendAnim(actor,blendname)\n")
  667. out_file.write(i2+"# theScene.stopBlendAnim(actor,blendname)\n")
  668. out_file.write(i2+"# theScene.changeBlendAnim(actor,blendname,blend_amount)\n")
  669. out_file.write(i2+"##########################################################################################################\n\n")
  670. out_file.write(i1+"def playBlendAnim(self,actor,blendName,loop=0):\n")
  671. out_file.write(i2+"actor.enableBlend()\n")
  672. out_file.write(i2+"blendDicts=self.blendAnimDict[actor.getName()]\n")
  673. out_file.write(i2+"blendList=blendDicts[blendName]\n")
  674. out_file.write(i2+"actor.setControlEffect(blendList[0],blendList[2])\n")
  675. out_file.write(i2+"actor.setControlEffect(blendList[1],1.0-blendList[2])\n")
  676. out_file.write(i2+"if(loop):\n")
  677. out_file.write(i2+i1+"actor.loop(blendList[0])\n")
  678. out_file.write(i2+i1+"actor.loop(blendList[1])\n")
  679. out_file.write(i2+"else:\n")
  680. out_file.write(i2+i1+"actor.start(blendList[0])\n")
  681. out_file.write(i2+i1+"actor.start(blendList[1])\n")
  682. out_file.write("\n")
  683. out_file.write(i1+"def stopBlendAnim(self,actor,blendName):\n")
  684. out_file.write(i2+"blendDicts=self.blendAnimDict[actor.getName()]\n")
  685. out_file.write(i2+"blendList=blendDicts[blendName]\n")
  686. out_file.write(i2+"actor.stop(blendList[0])\n")
  687. out_file.write(i2+"actor.stop(blendList[1])\n")
  688. out_file.write("\n")
  689. out_file.write(i1+"def changeBlending(self,actor,blendName,blending):\n")
  690. out_file.write(i2+"blendDicts=self.blendAnimDict[actor.getName()]\n")
  691. out_file.write(i2+"blendList=blendDicts[blendName]\n")
  692. out_file.write(i2+"blendList[2]=blending\n")
  693. out_file.write(i2+"self.blendAnimDict[actor.getName()]={blendName:[blendList[0],blendList[1],blending]}\n")
  694. out_file.write("\n")
  695. ####################################################################################################################################################
  696. # Hide and Show Methods
  697. ####################################################################################################################################################
  698. out_file.write("\n")
  699. out_file.write(i2+"##########################################################################################################\n")
  700. out_file.write(i2+"# Hide and Show Methods\n")
  701. out_file.write(i2+"# These will help you hide/show dummies, collision solids, effect nodes etc.\n")
  702. out_file.write(i2+"##########################################################################################################\n\n")
  703. out_file.write("\n")
  704. out_file.write(i1+"def hideDummies(self):\n")
  705. out_file.write("\n")
  706. out_file.write(i2+"for dummy in self.dummyDict:\n")
  707. out_file.write(i2+i1+"self.dummyDict[dummy].reparentTo(hidden)\n")
  708. out_file.write("\n")
  709. out_file.write(i1+"def hideCollSolids(self):\n")
  710. out_file.write("\n")
  711. out_file.write(i2+"for collSolid in self.collisionDict:\n")
  712. out_file.write(i2+i1+"self.collisionDict[collSolid].hide()\n")
  713. out_file.write("\n")
  714. out_file.write(i1+"def hideEffectNodes(self):\n")
  715. out_file.write("\n")
  716. out_file.write(i2+"for effectnode in self.particleNodes:\n")
  717. out_file.write(i2+i1+"self.particleNodes[effectnode].hide()\n")
  718. out_file.write("\n")
  719. out_file.write(i1+"def showDummies(self):\n")
  720. out_file.write("\n")
  721. out_file.write(i2+"for dummy in self.dummyDict:\n")
  722. out_file.write(i2+i1+"self.dummyDict[dummy].reparentTo(hidden)\n")
  723. out_file.write("\n")
  724. out_file.write(i1+"def showCollSolids(self):\n")
  725. out_file.write("\n")
  726. out_file.write(i2+"for collSolid in self.collisionDict:\n")
  727. out_file.write(i2+i1+"self.collisionDict[collSolid].show()\n")
  728. out_file.write("\n")
  729. out_file.write(i1+"def showEffectNodes(self):\n")
  730. out_file.write("\n")
  731. out_file.write(i2+"for effectnode in self.particleNodes:\n")
  732. out_file.write(i2+i1+"self.particleNodes[effectnode].show()\n\n")
  733. ##########################################################################################################
  734. # Saving Particle Parameters as a Class
  735. ##########################################################################################################
  736. out_file.write("\n")
  737. out_file.write(i2+"##########################################################################################################\n")
  738. out_file.write(i2+"# Particle Effects\n")
  739. out_file.write(i2+"# This is where effect parameters are saved in a class\n")
  740. out_file.write(i2+"# The class is then instantiated in the starteffects method and appended to the dictionaries\n")
  741. out_file.write(i2+"##########################################################################################################\n\n")
  742. for effect in AllScene.particleDict:
  743. out_file.write("\n\n")
  744. out_file.write("class " + str(effect) + ":\n")
  745. out_file.write(i1+"def __init__(self,mode=1,seParticleEffect=None,seParticles=None):\n")
  746. out_file.write(i2+"if(mode==0):\n")
  747. out_file.write(i2+i1+"self.effect=seParticleEffect.ParticleEffect()\n")
  748. out_file.write(i2+"else:\n")
  749. out_file.write(i2+i1+"self.effect=ParticleEffect.ParticleEffect()\n")
  750. AllScene.particleDict[effect].AppendConfig(out_file)
  751. #out_file.write(i2+"return self.effect\n")
  752. out_file.write("\n\n")
  753. out_file.write(i1+"def starteffect(self):\n")
  754. out_file.write(i2+"pass\n")
  755. out_file.write("\n\n")
  756. out_file.write(i1+"def stopeffect(self):\n")
  757. out_file.write(i2+"pass\n\n")
  758. out_file.write(i1+"def getEffect(self):\n")
  759. out_file.write(i2+"return self.effect\n\n")
  760. #Un-comment the lines below to make this a stand-alone file
  761. #out_file.write("Scene=SavedScene()\n")
  762. #out_file.write("run()\n")
  763. out_file.close()