paperDollClient.py (5827B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\carbon\client\script\graphics\paperDollClient.py 2 import collections 3 import telemetry 4 from carbon.common.script.sys.service import Service 5 from eve.client.script.paperDoll.paperDollImpl import Factory 6 from eve.client.script.paperDoll.paperDollSpawnWrappers import PaperDollManager 7 from eve.common.script.paperDoll.paperDollConfiguration import PerformanceOptions 8 from eve.common.script.paperDoll.paperDollDefinitions import GENDER 9 10 class PaperDollClientComponent(object): 11 12 def __init__(self): 13 self.doll = None 14 self.typeID = None 15 self.dna = None 16 self.gender = None 17 18 19 class PaperDollClient(Service): 20 __guid__ = 'svc.paperDollClient' 21 __notifyevents__ = [] 22 __dependencies__ = ['cacheDirectoryLimit'] 23 __componentTypes__ = ['paperdoll'] 24 25 def lazyprop(fn): 26 attr_name = '_lazy_' + fn.__name__ 27 28 @property 29 def _lazyprop(self): 30 if not hasattr(self, attr_name): 31 setattr(self, attr_name, fn(self)) 32 return getattr(self, attr_name) 33 34 return _lazyprop 35 36 @lazyprop 37 def dollFactory(self): 38 factory = Factory() 39 factory.compressTextures = True 40 factory.allowTextureCache = True 41 return factory 42 43 @lazyprop 44 def paperDollManager(self): 45 pdm = PaperDollManager(self.dollFactory, keyFunc=lambda doll: doll.GetName()) 46 return pdm 47 48 def Run(self, *etc): 49 PerformanceOptions.EnableOptimizations() 50 self._AppPerformanceOptions() 51 self.renderAvatars = True 52 53 def _AppPerformanceOptions(self): 54 raise NotImplementedError('This needs to be implemented in application specific, derived class.') 55 56 def CreateComponent(self, name, state): 57 component = PaperDollClientComponent() 58 component.gender = state.get('gender', None) 59 component.dna = state.get('dna', None) 60 component.typeID = state.get('typeID', None) 61 return component 62 63 def ReportState(self, component, entity): 64 report = collections.OrderedDict() 65 report['gender'] = self.GetDBGenderToPaperDollGender(component.gender) 66 report['autoLOD'] = component.doll.autoLod 67 report['overrideLod'] = component.doll.doll.overrideLod 68 return report 69 70 def GetDBGenderToPaperDollGender(self, gender): 71 if gender: 72 return GENDER.MALE 73 return GENDER.FEMALE 74 75 def SetupComponent(self, entity, component): 76 trinityScene = sm.GetService('graphicClient').GetScene(entity.scene.sceneID) 77 gender = self.GetDBGenderToPaperDollGender(component.gender) 78 resolution = self.GetInitialTextureResolution() 79 realDna = self.GetDollDNA(trinityScene, entity, gender, component.dna, session.bloodlineID) 80 if entity.entityID == session.charid: 81 shouldLOD = False 82 spawnAtLOD = -1 83 else: 84 shouldLOD = True 85 spawnAtLOD = 0 86 component.doll = self.SpawnDoll(trinityScene, entity, gender, realDna, shouldLOD, textureResolution=resolution, spawnAtLOD=spawnAtLOD) 87 component.doll.avatar.display = self.renderAvatars 88 if entity.HasComponent('animation'): 89 component.doll.avatar.animationUpdater = entity.GetComponent('animation').GetUpdater() 90 else: 91 self.LogError('Entity ' + entity + " doesn't have an animation component, so the PaperDoll component didn't load an animationUpdater!") 92 component.doll.avatar.name = str(entity.entityID) 93 94 def RegisterComponent(self, entity, component): 95 positionComponent = entity.GetComponent('position') 96 if positionComponent: 97 pass 98 99 def GetPaperDollByEntityID(self, entID): 100 return self.paperDollManager.GetPaperDollCharacterByKey(str(entID)) 101 102 def PackUpForSceneTransfer(self, component, destinationSceneID): 103 return {'gender': component.gender, 104 'dna': component.dna, 105 'typeID': component.typeID} 106 107 def UnPackFromSceneTransfer(self, component, entity, state): 108 component.gender = state.get('gender', None) 109 component.dna = state.get('dna', None) 110 component.typeID = state.get('typeID', None) 111 return component 112 113 def GetInitialTextureResolution(self): 114 return None 115 116 def GetDollDNA(self, scene, entity, dollGender, dollDnaInfo, bloodlineID): 117 return dollDnaInfo 118 119 @telemetry.ZONE_METHOD 120 def SpawnDoll(self, scene, entity, dollGender, dollDnaInfo, shouldLod, textureResolution = None, spawnAtLOD = 0): 121 positionComponent = entity.GetComponent('position') 122 if dollDnaInfo is not None: 123 doll = self.paperDollManager.SpawnPaperDollCharacterFromDNA(scene, str(entity.entityID), dollDnaInfo, position=positionComponent.position, gender=dollGender, lodEnabled=shouldLod, textureResolution=textureResolution, spawnAtLOD=spawnAtLOD) 124 else: 125 doll = self.paperDollManager.SpawnDoll(scene, point=positionComponent.position, gender=dollGender, autoLOD=shouldLod, lod=spawnAtLOD) 126 return doll 127 128 def UnRegisterComponent(self, entity, component): 129 if component.callback and entity.HasComponent('position'): 130 entity.GetComponent('position').UnRegisterPlacementObserverWrapper(component.callback) 131 component.callback = None 132 133 def TearDownComponent(self, entity, component): 134 component.doll.avatar.animationUpdater = None 135 component.doll.avatar.worldTransformUpdater = None 136 self.paperDollManager.RemovePaperDollCharacter(component.doll) 137 component.doll = None 138 139 def ToogleRenderAvatars(self): 140 self.renderAvatars = not self.renderAvatars 141 for doll in self.paperDollManager: 142 doll.avatar.display = self.renderAvatars