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

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