NovaBryan/EVE_Dump
Log | Files | 📦 下载最新源码 (.zip) | Refs | README

commonClientFunctions.py (6693B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\paperDoll\commonClientFunctions.py
      2 import eve.common.script.paperDoll.paperDollDefinitions as pdDef
      3 from yamlext.blueutil import ReadYamlFile
      4 import trinity
      5 import telemetry
      6 import blue
      7 import weakref
      8 INTERIOR_FEMALE_GEOMETRY_RESPATH = const.DEFAULT_FEMALE_PAPERDOLL_MODEL
      9 INTERIOR_MALE_GEOMETRY_RESPATH = const.DEFAULT_MALE_PAPERDOLL_MODEL
     10 DRAPE_TUCK_NAMES = ('DrapeShape', 'TuckShape')
     11 HAIR_MESH_SHAPE = 'HairMeshShape'
     12 TRANSLATION = intern('translation')
     13 ROTATION = intern('rotation')
     14 
     15 def CreateRandomDoll(name, factory, outResources = None):
     16     from eve.common.script.paperDoll.paperDollRandomizer import DollRandomizer
     17     dollRand = DollRandomizer(factory)
     18     doll = dollRand.GetDoll()
     19     doll.name = name
     20     return doll
     21 
     22 
     23 def CheckDuplicateMeshes(meshes):
     24     meshCount = len(meshes)
     25     for i in xrange(meshCount):
     26         for x in xrange(i + 1, meshCount):
     27             if meshes[i].name == meshes[x].name and meshes[i].geometryResPath == meshes[x].geometryResPath:
     28                 raise Exception('Duplicate meshes!\n Mesh name:%s Mesh Geometry Respath:%s' % (meshes[i].name, meshes[i].geometryResPath))
     29 
     30 
     31 def GetEffectsFromAreaList(areas):
     32     effects = []
     33     for each in iter(areas):
     34         effects.append(each.effect)
     35 
     36     return effects
     37 
     38 
     39 def MeshAreaIterator(mesh):
     40     for areaList in MeshAreaListIterator(mesh):
     41         for area in iter(areaList):
     42             yield area
     43 
     44 
     45 def MeshAreaListIterator(mesh):
     46     yield mesh.opaqueAreas
     47     yield mesh.decalAreas
     48     yield mesh.depthAreas
     49     yield mesh.transparentAreas
     50     yield mesh.additiveAreas
     51     yield mesh.pickableAreas
     52     yield mesh.mirrorAreas
     53 
     54 
     55 @telemetry.ZONE_FUNCTION
     56 def GetEffectsFromMesh(mesh, allowShaderMaterial = False):
     57     effects = []
     58     if type(mesh) is trinity.Tr2Mesh:
     59         for area in MeshAreaListIterator(mesh):
     60             effects += GetEffectsFromAreaList(area)
     61 
     62     if not allowShaderMaterial:
     63         effects = [ effect for effect in effects if effect ]
     64     return effects
     65 
     66 
     67 def MoveAreas(fromAreaList, toAreaList):
     68     areas = list(fromAreaList)
     69     del fromAreaList[:]
     70     for area in areas:
     71         toAreaList.append(area)
     72 
     73 
     74 def SetOrAddMap(effect, mapName, mapPath = None):
     75     existing = effect.resources.FindByName(mapName)
     76     if existing:
     77         if mapPath and existing.resourcePath != mapPath:
     78             existing.resourcePath = mapPath
     79         return existing
     80     param = trinity.TriTextureParameter()
     81     param.name = mapName
     82     if mapPath:
     83         param.resourcePath = mapPath
     84     effect.resources.append(param)
     85     return param
     86 
     87 
     88 def FindOrAddMat4(effect, name):
     89     existing = effect.parameters.FindByName(name)
     90     if existing:
     91         return existing
     92     p = trinity.Tr2Matrix4Parameter()
     93     p.name = name
     94     effect.parameters.append(p)
     95     return p
     96 
     97 
     98 def FindOrAddVec4(effect, name):
     99     existing = effect.parameters.FindByName(name)
    100     if existing:
    101         return existing
    102     p = trinity.Tr2Vector4Parameter()
    103     p.name = name
    104     effect.parameters.append(p)
    105     return p
    106 
    107 
    108 def __WeakBlueRemoveHelper(weakInstance, dictionaryName, weakObjectKey):
    109     if weakInstance():
    110         dictionary = getattr(weakInstance(), dictionaryName)
    111         if dictionary is not None:
    112             dictionary.pop(weakObjectKey, None)
    113     if weakObjectKey:
    114         weakObjectKey.callback = None
    115 
    116 
    117 def AddWeakBlue(classInstance, dictionaryName, blueObjectKey, value):
    118     dictionary = getattr(classInstance, dictionaryName)
    119     if dictionary is None:
    120         return
    121     for key in dictionary.iterkeys():
    122         if key.object == blueObjectKey:
    123             dictionary[key] = value
    124             return
    125 
    126     weakInstance = weakref.ref(classInstance)
    127     weakObjectKey = blue.BluePythonWeakRef(blueObjectKey)
    128     weakObjectKey.callback = lambda : __WeakBlueRemoveHelper(weakInstance, dictionaryName, weakObjectKey)
    129     dictionary[weakObjectKey] = value
    130 
    131 
    132 def DestroyWeakBlueDict(dictionary):
    133     for weakObjectKey in dictionary.iterkeys():
    134         if weakObjectKey:
    135             weakObjectKey.callback = None
    136 
    137 
    138 def IsBeard(areaMesh):
    139     return areaMesh.effect is not None and 'furshell' in areaMesh.effect.effectFilePath.lower()
    140 
    141 
    142 def IsSkin(fx):
    143     fxName = fx.name.lower()
    144     return fxName.startswith('c_skin') and 'tearduct' not in fxName
    145 
    146 
    147 def IsGlasses(areaMesh):
    148     return areaMesh.effect is not None and 'glassshader' in areaMesh.effect.effectFilePath.lower()
    149 
    150 
    151 def StripDigits(name):
    152     return ''.join((letter.lower() for letter in name if not letter.isdigit()))
    153 
    154 
    155 def PutMeshToLookup(lookup, m):
    156     meshName = StripDigits(m.name)
    157     c = 0
    158     try:
    159         c = int(m.name.split(meshName)[-1])
    160     except ValueError:
    161         c = 0
    162 
    163     meshName = StripDigits(m.name)
    164     lookup[meshName] = max([c, lookup.get(meshName)]) + 1
    165 
    166 
    167 def FindParameterByName(effect, parameterName):
    168     for param in effect.parameters:
    169         if hasattr(param, 'name') and param.name == parameterName:
    170             return param
    171 
    172 
    173 def FindResourceByName(effect, resourceName):
    174     for res in effect.resources:
    175         if res.name == resourceName:
    176             return res
    177 
    178 
    179 def GetSkintypeColor(skintypePath, isMale):
    180     if isMale:
    181         basePath = pdDef.MALE_BASE_PATH
    182     else:
    183         basePath = pdDef.FEMALE_BASE_PATH
    184     if skintypePath.startswith('/'):
    185         fmt = '{0}{1}'
    186     else:
    187         fmt = '{0}/{1}'
    188     completePath = fmt.format(basePath, skintypePath)
    189     skintypeData = ReadYamlFile(completePath)
    190     if skintypeData is None:
    191         return
    192     return skintypeData[2]
    193 
    194 
    195 def TryGetSkintypeColorVariation(dnaRow):
    196     modifierLocations = cfg.paperdollModifierLocations
    197     resources = cfg.paperdollResources
    198     for modifierRow in dnaRow.modifiers:
    199         modifierInfo = modifierLocations.GetIfExists(modifierRow.modifierLocationID)
    200         if modifierInfo.modifierKey == pdDef.BODY_CATEGORIES.SKINTYPE:
    201             resourcesInfo = resources.GetIfExists(modifierRow.paperdollResourceID)
    202             return GetSkintypeColor(resourcesInfo.resPath, resourcesInfo.resGender)
    203 
    204 
    205 def TryGetSkintoneColorVariation(dnaRow):
    206     colors = cfg.paperdollColors
    207     colorNames = cfg.paperdollColorNames
    208     for colorRow in dnaRow.colors:
    209         colorInfo = colors.GetIfExists(colorRow.colorID)
    210         colorNameInfo = colorNames.GetIfExists(colorRow.colorNameA)
    211         colorNameA = colorNameInfo.colorName
    212         if colorInfo.colorKey == pdDef.BODY_CATEGORIES.SKINTONE:
    213             return colorNameA
    214 
    215 
    216 def GetSkinTypeOrToneColorVariation(dnaRow):
    217     colorVar = TryGetSkintypeColorVariation(dnaRow)
    218     if colorVar is not None:
    219         return colorVar
    220     return TryGetSkintoneColorVariation(dnaRow)