home *** CD-ROM | disk | FTP | other *** search
/ Enter 2004 April / enter-2004-04.iso / files / EVE_1424_100181.exe / importutil.py < prev    next >
Encoding:
Python Source  |  2004-04-20  |  17.0 KB  |  549 lines

  1. # importutil.py
  2. # does stuff
  3.  
  4. import blue
  5. import trinity
  6. from string import split, find
  7.  
  8. def GetFilename():
  9.     import app
  10.     filename = app.macro.currentScript
  11.     if filename.rfind('/') > 0:
  12.         filename = filename[filename.rfind('/') + 1:]
  13.     elif filename.rfind('\\') > 0:
  14.         filename = filename[filename.rfind('\\') + 1:]
  15.     if filename.rfind('.') > 0:
  16.         filename = filename[:filename.rfind('.')]
  17.     return filename
  18.  
  19. New = blue.os.CreateInstance
  20.  
  21. class PyROT:
  22.     def __init__(self):
  23.         self.rot = New("blue.Rot")
  24.  
  25.  
  26.     def GetInstance(self, name, clsid = "", ret = None):
  27.         if clsid == "":
  28.             return self.rot.GetInstance(name, clsid, ret)
  29.         else:
  30.             return self.rot.GetInstance(name, clsid)
  31.  
  32.  
  33.     def GetNewInstance(self, name, clsid):
  34.         obj = self.GetInstance(name, clsid)
  35.         fresh = New(clsid)
  36.         fresh.CopyTo(obj)
  37.         return obj
  38.  
  39.  
  40.     def Copy(self, name, name2):
  41.         obj = self.rot.GetInstance(name)
  42.         if not obj:
  43.             return 0
  44.         obj2 = self.rot.GetInstance(name2)
  45.         if obj2:
  46.             return 0
  47.             # PENDING A WAY TO DELETE FROM THE ROT
  48.         rot.RegisterObject(obj, name2)
  49.         return 1
  50.  
  51.  
  52.     def DeepCopy(self, name, name2):
  53.         pass
  54.  
  55.  
  56.     def ShallowCopy(self, name, name2):
  57.         pass
  58.  
  59.  
  60.     def Move(self, name, name2):
  61.         pass
  62.         ## PENDING A WAY TO DELETE FROM THE ROT
  63.  
  64.  
  65.     def Delete(self, name):
  66.         pass
  67.         ## PENDING A WAY TO DELETE FROM THE ROT
  68.  
  69.  
  70. myRot = PyROT()
  71. rot = myRot
  72.  
  73. #########################################################################################
  74. ## Deep compare stuff
  75. #########################################################################################
  76. from string import join
  77.  
  78. class DeepCmp:
  79.     def __init__(self):
  80.         self.fieldList = []
  81.         self.attributeList = []
  82.         self.compMap = {
  83.             "TriVector":        ["z", "y", "x"],
  84.             "TriQuaternion":    ["w","z", "y", "x"],
  85.             "TriColor":         ["a", "b", "g", "r"]
  86.             }
  87.         self.excludeList = []
  88.         self.compareList = []
  89.  
  90.     def CompVector(self, var1, var2, variables):
  91.         diff = 0
  92.         for mem in variables:
  93.             self.fieldList.append(mem)
  94.             v1 = str(getattr(var1, mem))
  95.             v2 = str(getattr(var2, mem))
  96.             if v1 != v2:
  97.                 diff = 1
  98.                 self.attributeList.append(join(self.fieldList, ".") + " (" + v1 + ", " + v2 + ")"  )
  99.             self.fieldList.pop(-1)
  100.         return diff
  101.  
  102.     def CompBlueList(self, list1, list2):
  103.         if len(list1) != len(list2):
  104.             return 1
  105.         diff = 0
  106.         diffAll = 0
  107.         for i in range(len(list1)):
  108.             #savelen = len(self.fieldList)
  109.             savename = self.fieldList[-1]
  110.             self.fieldList[-1] += "[" + str(i) + "]"
  111.             diff = self.CompareMember(list1[i], list2[i])
  112.             if diff:
  113.                 diffAll = 1
  114.                 #errorlist = self.fieldList[:savelen]
  115.                 #errorlist[-1] = savename
  116.                 self.attributeList.append(join(self.fieldList, "."))
  117.                 #return diff
  118.             self.fieldList[-1] = savename
  119.         return diffAll
  120.         ##not used for now
  121.         """
  122.         if not diff:
  123.             return 0
  124.         l1 = list1[:]
  125.         l2 = list2[:]
  126.         try:
  127.             l1.sort()
  128.             l2.sort()
  129.         except:
  130.             return diff
  131.         for i in range(l1):
  132.             if self.CompareMember(l1[i], l2[i]):
  133.                 ##we return the first difference in the unsorted list
  134.                 return diff
  135.         return 0
  136.         """
  137.  
  138.     def Cmp(self, obj1, obj2):
  139.         self.fieldList = []
  140.         self.attributeList = []
  141.         yada = self.DeepCompare(obj1, obj2)
  142.         if yada:
  143.             if self.compareList:
  144.                 for attrString in self.attributeList[:]:
  145.                     flag = 0
  146.                     for compStr in self.compareList:
  147.                         if attrString.find(compStr) > 0:
  148.                             flag = 1
  149.                     if not flag:
  150.                         self.attributeList.remove(attrString)
  151.             self.attributeList.reverse()
  152.             return self.attributeList
  153.         return []
  154.  
  155.  
  156.     def DeepCompare(self, obj1, obj2):
  157.         self.fieldList.append(getattr(obj1, "__typename__", ""))
  158.         import blue
  159.         #from ui.constants import BeREAD, BeWRITE, BePERSIST, BeBOOL
  160.         BeREAD, BeBOOL, BePERSIST = 1,4,16
  161.         type1 = getattr(obj1, "__typename__", None)
  162.         type2 = getattr(obj2, "__typename__", None)
  163.         if type1 != type2:
  164.             self.attributeList.append(join(self.fieldList, ".") + " (" + str(type1) + ", " + str(type2) + ")"  )
  165.             return self.fieldList
  166.         memberDict = obj1.TypeInfo()[2]
  167.         diffAll = 0
  168.         for item in memberDict.iteritems():
  169.             if item[1].has_key('editflags'):
  170.                 ##only interested in attributes that get saved
  171.                 if (item[1]['editflags'] & BePERSIST):
  172.                     if self.excludeList:
  173.                         if item[0] in self.excludeList:
  174.                             continue
  175.                     self.fieldList.append(item[0])
  176.                     ##something weird with booleans, ie once useCurves was true, but it's value was not 1 but 152
  177.                     if (item[1]['type'] == BeBOOL):
  178.                         v1 = getattr(obj1, item[0])
  179.                         v2 = getattr(obj2, item[0])
  180.                         diff = ((not v1) != (not v2))
  181.                         if diff:
  182.                             diffAll = 1
  183.                             self.attributeList.append(join(self.fieldList, ".") + " (" + str(v1) + ", " + str(v2) + ")")
  184.                     elif type(getattr(obj1,item[0])).__name__ == "BlueWrapper":
  185.                         diff = self.CompareMember(getattr(obj1,item[0]), getattr(obj2, item[0]))
  186.                         if diff:
  187.                             diffAll = 1
  188.                             self.attributeList.append(join(self.fieldList, "."))
  189.                     else:
  190.                         v1 = getattr(obj1, item[0])
  191.                         v2 = getattr(obj2, item[0])
  192.                         if v1 != v2:
  193.                             diffAll = 1
  194.                             self.attributeList.append(join(self.fieldList, ".") + " (" + str(v1) + ", " + str(v2) + ")"  )
  195.                         ##return self.fieldList
  196.                     self.fieldList.pop(-1)
  197.         self.fieldList.pop(-1)
  198.         return diffAll
  199.  
  200.  
  201.     def CompareMember(self, var1, var2):
  202.         if self.compMap.has_key(var1.__typename__):
  203.             return self.CompVector(var1, var2, self.compMap[var1.__typename__])
  204.         elif var1.__typename__ == "List":
  205.             return self.CompBlueList(var1, var2)
  206.         else:
  207.             return self.DeepCompare(var1, var2)
  208.  
  209.  
  210. #########################################################################################
  211. ## Construction functions
  212. #########################################################################################
  213.  
  214. def NewScene(name):
  215.     ret = myRot.GetNewInstance("imports:/" + GetFilename() + "/Scene/" + name, "trinity.TriScene")
  216.     ret.name = name
  217.     return ret
  218.  
  219.  
  220. def NewUI(name):
  221.     ret = myRot.GetNewInstance("imports:/" + GetFilename() + "/UI/" + name, "trinity.TriUI")
  222.     ret.name = name
  223.     return ret
  224.  
  225.  
  226. def NewCamera(name):
  227.     ret = myRot.GetNewInstance("imports:/" + GetFilename() + "/Camera/" + name, "trinity.TriCamera")
  228.     ret.name = name
  229.     return ret
  230.  
  231.  
  232. def NewTransform(name, url = ""):
  233.     if url == "":
  234.         url = "imports:/" + GetFilename() + "/Transform/" + name
  235.     ret = trinity.TriTransform()
  236.     ret.name = name
  237.     return ret
  238.  
  239. def NewSplTransform(name, url = ""):
  240.     if url == "":
  241.         url = "imports:/" + GetFilename() + "/SplTransform/" + name
  242.     ret = trinity.TriSplTransform()
  243.     ret.name = name
  244.     return ret
  245.  
  246.  
  247. def NewFlare(name, texture = None, shader = None, url = ""):
  248.     if url == "":
  249.         url = "imports:/" + GetFilename() + "/Flare/" + name
  250.     ret = myRot.GetNewInstance(url, "trinity.TriFlare")
  251.     ret.name = name
  252.     if texture and shader:
  253.         ret.flare = NewTransform(name)
  254.         ret.flare.transformBase = trinity.TRITB_CAMERA_ROTATION
  255.         ret.flare.object = NewModel(name + "Model", "res:/model/global/Zsprite.tri")
  256.         area = ret.flare.object.areas[0]
  257.         area.name = "WholeSprite"
  258.         mat = NewMaterial(name + "Material")
  259.         area.areaMaterials.append(mat)
  260.         tex = NewTexture(name + "Texture", texture)
  261.         tex.magFilter = trinity.TRITEXF_ANISOTROPIC
  262.         tex.minFilter = trinity.TRITEXF_ANISOTROPIC
  263.         tex.mipFilter = trinity.TRITEXF_LINEAR
  264.         area.areaTextures.append(tex)
  265.         area.shader = shader
  266.     return ret
  267.  
  268.  
  269. def NewNebula(name, url = ""):
  270.     if url == "":
  271.         url = "imports:/" + GetFilename() + "/Nebula/"  + name
  272.     ret = myRot.GetNewInstance(url, "trinity.TriTransform")
  273.     ret.name = name
  274.     return ret
  275.  
  276.  
  277. def NewPlanet(name, url = ""):
  278.     if url == "":
  279.         url = "imports:/" + GetFilename() + "/Planet/"  + name
  280.     ret = myRot.GetNewInstance(url, "trinity.TriTransform")
  281.     ret.name = name
  282.     return ret
  283.  
  284.  
  285. def NewControl(name, url = ""):
  286.     if url == "":
  287.         url = "imports:/" + GetFilename() + "/Control/" + name
  288.     ret = myRot.GetNewInstance(url, "trinity.TriTransform")
  289.     ret.name = name
  290.     return ret
  291.  
  292.  
  293. def NewSun(name, url = ""):
  294.     if url == "":
  295.         url = "imports:/" + GetFilename() + "/Sun/" + name
  296.     ret = myRot.GetNewInstance(url, "trinity.TriTransform")
  297.     ret.name = name
  298.     return ret
  299.  
  300.  
  301. def NewParticleEmitter(name, url = ""):
  302.     if url == "":
  303.         url = "imports:/" + GetFilename() + "/ParticleEmitter/" + name
  304.     ret = myRot.GetNewInstance(url, "trinity.TriTransform")
  305.     ret.name = name
  306.     return ret
  307.  
  308.  
  309. def NewModel(name, vertices = "", url = ""):
  310.     if url == "":
  311.         url = "imports:/" + GetFilename() + "/Model/" + name
  312.     ret = trinity.TriModel()
  313.     ret.name = name
  314.     if vertices != "":
  315.         ret.vertices = vertices
  316.     return ret
  317.  
  318.  
  319. def NewShader(name, url = ""):
  320.     if url == "":
  321.         url = "imports:/" + GetFilename() + "/Shader/" + name
  322.     ret = trinity.TriShader()
  323.     ret.name = name
  324.     return ret
  325.  
  326.  
  327. def NewPass(name, url = ""):
  328.     if url == "":
  329.         url = "imports:/" + GetFilename() + "/Pass/" + name
  330.     ret = trinity.TriPass()
  331.     ret.name = name
  332.     ## the pass creator cheets a bit and creates some textureStages
  333.     ## this is a bit of a problem but if the url was empty at the top then this should be safe
  334.     if url == "imports:/" + GetFilename() + "/Pass/" + name:
  335.         ret.textureStage0 = NewTextureStage("TS0"+name)
  336.         ret.textureStage1 = NewTextureStage("TS1"+name)
  337.     return ret
  338.  
  339.  
  340. def NewTextureStage(name, url = ""):
  341.     if url == "":
  342.         url = "imports:/" + GetFilename() + "/TextureStage/" + name
  343.     ret = trinity.TriTextureStage()
  344.     ret.name = name
  345.     return ret
  346.  
  347.  
  348. def NewTexture(name, pixels="", url = ""):
  349.     name =  split(pixels,'/')[-1:][0]
  350.     if url == "":
  351.         url = "imports:/" + GetFilename() + name
  352.     #ret = myRot.GetNewInstance(url , "trinity.TriTexture")
  353.     ret = trinity.TriTexture()
  354.     ret.name = name
  355.     if pixels != "":
  356.         ret.pixels = pixels
  357.     return ret
  358.  
  359.  
  360. def NewMaterial(name, url = ""):
  361.     if url == "":
  362.         url = "imports:/" + GetFilename() + "/Material/" + name
  363.     ret = trinity.TriMaterial()
  364.     ret.name = name
  365.     return ret
  366.  
  367.  
  368. def NewRadar(name, url = ""):
  369.     if url == "":
  370.         url = "imports:/" + GetFilename() + "/Radar/" + name
  371.     ret = myRot.GetNewInstance(url , "trinity.TriRadar")
  372.     ret.name = name
  373.     return ret
  374.  
  375.  
  376. def NewRadarObject(name, url = ""):
  377.     if url == "":
  378.         url = "imports:/" + GetFilename() + "/RadarObject/"  + name
  379.     ret = myRot.GetNewInstance(url , "trinity.TriRadarObject")
  380.     ret.name = name
  381.     return ret
  382.  
  383.  
  384. def NewPointStarfield(name, url = ""):
  385.     if url == "":
  386.         url = "imports:/" + GetFilename() + "/PointStarfield/" + name
  387.     ret = myRot.GetNewInstance(url , "trinity.TriPointStarfield")
  388.     ret.name = name
  389.     return ret
  390.  
  391.  
  392. def NewLight(name, url = ""):
  393.     if url == "":
  394.         url = "imports:/" + GetFilename() + "/Light/" + name
  395.     ret = myRot.GetNewInstance(url , "trinity.TriLight")
  396.     ret.name = name
  397.     return ret
  398.  
  399.  
  400. def NewLine(name, url = ""):
  401.     if url == "":
  402.         url = "imports:/" + GetFilename() + "/Line/" + name
  403.     ret = myRot.GetNewInstance(url , "trinity.TriLine")
  404.     ret.name = name
  405.     return ret
  406.  
  407.  
  408. def NewLensFlare(name, url = ""):
  409.     if url == "":
  410.         url = "imports:/" + GetFilename() + "/LensFlare/" + name
  411.     ret = myRot.GetNewInstance(url , "trinity.TriLensFlare")
  412.     ret.name = name
  413.     return ret
  414.  
  415.  
  416.  
  417. #########################################################################################
  418. ## Utility functions
  419. #########################################################################################
  420.  
  421. def AddModel(tf):
  422.     dev = rot.GetInstance("tri:/dev", "trinity.TriDevice")
  423.     if not dev:
  424.         print "no device available"
  425.     else:
  426.         AddToListUnique(dev.scene.models, tf)
  427.  
  428.  
  429. def NewSimpleOnePassShader(name, texture1, matSrc, texSrc):
  430.     ret = NewShader(name)
  431.  
  432.     pass0 = NewPass(name+"Pass0")
  433.     ## this function creates shaders that use the shader itself as
  434.     ## texture and material source
  435.     pass0.materialSource = matSrc
  436.     pass0.materialSourceIndex = 0
  437.     pass0.textureStage0.textureSource = texSrc
  438.     pass0.textureStage0.textureSourceIndex = 0
  439.     pass0.textureStage1.display = 0
  440.     AddToListUnique(ret.passes, pass0)
  441.     if(texture1 != ""):
  442.         tex = NewTexture(name+"Texture", texture1)
  443.         AddToListUnique(ret.shaderTextures, tex)
  444.     else:
  445.         if texSrc == trinity.TRITEXSRC_SHADER or texSrc == trinity.TRITEXSRC_NONE:
  446.             pass0.textureStage0.colorOp = trinity.TRITOP_DISABLE
  447.     mat = NewMaterial(name+"Material")
  448.     AddToListUnique(ret.shaderMaterials, mat)
  449.     return ret
  450.  
  451.  
  452. def AssignShaderToModel(model, areaNum, areaName, shader):
  453.     if areaNum < len(model.areas):
  454.         model.areas[areaNum].shader = shader
  455.         model.areas[areaNum].name = areaName
  456.  
  457. def SetNebula(scene, tex):
  458.     tf = New("trinity.TriTransform")
  459.     tf.scaling.SetXYZ(19000.0, 19000.0, 19000.0)
  460.     tf.transformBase = 2
  461.     model = New("trinity.TriModel")
  462.     tf.object = model
  463.     model.vertices = "res:/Model/Global/sphereOneAreaShape.tri"
  464.     area = model.areas[0]
  465.  
  466.     tx = New("trinity.TriTexture")
  467.     tx.pixels = tex
  468.     area.areaTextures.append(tx)
  469.     tx.magFilter = 2
  470.     tx.minFilter = 2
  471.     tx.mipFilter = 2
  472.     tx.addressU = 2
  473.     tx.addressV = 2
  474.     tx.addressW = 1
  475.     tx.transformBase = 4
  476.     area.areaMaterials.append()
  477.  
  478.     shader = rot.GetInstance("tri:/Shader/nebula", "", None)
  479.     if not shader:
  480.         shader = rot.GetInstance("tri:/Shader/nebula", "trinity.TriShader")
  481.         shader.writeZ = 0
  482.         shader.zFunc = 4
  483.         shader.opaque = 1
  484.         shader.cull = 2
  485.         shader.zBias = 0
  486.  
  487.         # Pass neb_pass1
  488.         pa = New("trinity.TriPass")
  489.         pa.materialSource = 2
  490.         pa.materialSourceIndex = 0
  491.         pa.shading = 2
  492.         pa.fill = 3
  493.         pa.blendOp = 1
  494.         pa.srcBlend = 10
  495.         pa.dstBlend = 2
  496.         pa.textureStage0 = New("trinity.TriTextureStage")
  497.         shader.passes.append(pa)
  498.  
  499.         #Texturestage Stage0 of neb_Pass
  500.         stg = pa.textureStage0
  501.         stg.display = 1
  502.         stg.name = "Stage0 of neb_Pass"
  503.         stg.colorOp = 3
  504.         stg.colorArg1 = 1
  505.         stg.colorArg2 = 2
  506.         stg.alphaOp = 1
  507.         stg.alphaArg1 = 0
  508.         stg.alphaArg2 = 2
  509.         stg.textureSource = 2
  510.         stg.textureSourceIndex = 0
  511.         stg.texCoordIndex = 0
  512.         stg.texCoordIndexFlags = 65536
  513.         stg.textureTransFormFlags = 2
  514.  
  515.     area.shader = shader
  516.     scene.nebula = tf
  517.  
  518.  
  519. ## adds the 'item' to the 'list' and makes sure that there is only one instance
  520. ## of 'item' in the list (well technically it make sure that the number of instances
  521. ## of 'item' in the list is 1 if it was 0 before the call and 'n' if it was 'n' before the call)
  522. def AddToListUnique(list, item):
  523.     if item in list:
  524.         return
  525.     list.append(item)
  526.  
  527.  
  528. ## finds the first parent of a transform in a specific
  529. ## transform list, for example scene.models
  530. def FindParent(tf, list):
  531.     for item in list:
  532.         for child in item.children:
  533.             if child == tf:
  534.                 return item
  535.         return FindParent(tf, item.children)
  536.     return None
  537.  
  538.  
  539. ## A good debugging function to print out the hhierarchy of a transform list
  540. def PrintTransformHierarchy(list, tab = "", prnRot = 0):
  541.     for item in list:
  542.         if prnRot:
  543.             print tab, item.name, "    ", rot.GetObjectPathName(item)
  544.         else:
  545.             print tab, item.name
  546.         PrintTransformHierarchy(item.children, tab + "    ")
  547.  
  548.  
  549.