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)