seFileSaver.py 54 KB

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