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

bloodlineSelector.py (9893B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\login\charcreation\bloodlineSelector.py
      2 from __future__ import absolute_import
      3 import log
      4 import remotefilecache
      5 import trinity
      6 import random
      7 import blue
      8 import geo2
      9 from . import grannyLoader
     10 from eve.client.script.paperDoll.paperDollSpawnWrappers import PaperDollCharacter
     11 RACE_PATHS_MAPPING = {1: [[['res:/Graphics/Character/Unique/CharacterSelect/AchuraFemaleClothing', 'res:/Graphics/Character/Unique/CharacterSelect/AchuraMaleClothing'], 11, 3], [['res:/Graphics/Character/Unique/CharacterSelect/CivireFemaleClothing', 'res:/Graphics/Character/Unique/CharacterSelect/CivireMaleClothing'], 2, 4], [['res:/Graphics/Character/Unique/CharacterSelect/DeteisFemaleClothing', 'res:/Graphics/Character/Unique/CharacterSelect/DeteisMaleClothing'], 1, 5]],
     12  2: [[['res:/Graphics/Character/Unique/CharacterSelect/BrutorFemaleClothing', 'res:/Graphics/Character/Unique/CharacterSelect/BrutorMaleClothing'], 4, 9], [['res:/Graphics/Character/Unique/CharacterSelect/SebiestorFemaleClothing', 'res:/Graphics/Character/Unique/CharacterSelect/SebiestorMaleClothing'], 3, 10], [['res:/Graphics/Character/Unique/CharacterSelect/VherokiorFemaleClothing', 'res:/Graphics/Character/Unique/CharacterSelect/VherokiorMaleClothing'], 14, 11]],
     13  4: [[['res:/Graphics/Character/Unique/CharacterSelect/AmarrFemaleClothing', 'res:/Graphics/Character/Unique/CharacterSelect/AmarrMaleClothing'], 5, 0], [['res:/Graphics/Character/Unique/CharacterSelect/KhanidFemaleClothing', 'res:/Graphics/Character/Unique/CharacterSelect/KhanidMaleClothing'], 13, 1], [['res:/Graphics/Character/Unique/CharacterSelect/NikunniFemaleClothing', 'res:/Graphics/Character/Unique/CharacterSelect/NikunniMaleClothing'], 6, 2]],
     14  8: [[['res:/Graphics/Character/Unique/CharacterSelect/GallenteFemaleClothing', 'res:/Graphics/Character/Unique/CharacterSelect/GallenteMaleClothing'], 7, 6], [['res:/Graphics/Character/Unique/CharacterSelect/IntakiFemaleClothing', 'res:/Graphics/Character/Unique/CharacterSelect/IntakiMaleClothing'], 8, 7], [['res:/Graphics/Character/Unique/CharacterSelect/JinmeiFemaleClothing', 'res:/Graphics/Character/Unique/CharacterSelect/JinMeiMaleClothing'], 12, 8]]}
     15 ANIM_DIR = 'res:\\animation\\%s\\charactercreation'
     16 LIGHT_CURVE = 'res:/Graphics/Placeable/CharCreation/LightCurve.red'
     17 LIGHT_RIGS = {1: 'res:/Graphics/Character/Global/PaperdollSettings/LightSettings/BloodlineCaldari.red',
     18  2: 'res:/Graphics/Character/Global/PaperdollSettings/LightSettings/BloodlineMinmatar.red',
     19  4: 'res:/Graphics/Character/Global/PaperdollSettings/LightSettings/BloodlineAmarr.red',
     20  8: 'res:/Graphics/Character/Global/PaperdollSettings/LightSettings/BloodlineGAllente.red'}
     21 
     22 class BloodlineSelector(object):
     23 
     24     def __init__(self, scene):
     25         self.race = None
     26         self.lineUp = []
     27         self.scene = scene
     28         self.currentSelection = None
     29 
     30     def LoadRace(self, raceID, callBack = None):
     31         if self.race == raceID:
     32             return
     33         if self.race is not None:
     34             self.TearDown()
     35         self.currentSelection = None
     36         self.SetLightScene(LIGHT_RIGS[raceID], self.scene)
     37         factory = sm.GetService('character').factory
     38         if raceID in RACE_PATHS_MAPPING:
     39             self.race = raceID
     40             for bloodline in RACE_PATHS_MAPPING[raceID]:
     41                 female = PaperDollCharacter.ImportCharacter(factory, self.scene, bloodline[0][0])
     42                 male = PaperDollCharacter.ImportCharacter(factory, self.scene, bloodline[0][1])
     43                 self.lineUp.append(self.Platform((female, male), bloodline[1], bloodline[2]))
     44 
     45         else:
     46             log.LogError('raceID ' + raceID + ' not valid')
     47             return
     48         remotefilecache.prefetch_folder(ANIM_DIR % 'female')
     49         remotefilecache.prefetch_folder(ANIM_DIR % 'male')
     50         for platform in self.lineUp:
     51             for i, each in enumerate(platform.pair):
     52                 grannyLoader.GrannyBloodlineAnimationLoader(each.avatar, i, platform.poseID)
     53 
     54             trinity.WaitForResourceLoads()
     55             platform.Deactivate()
     56 
     57         self.PositionLineUp()
     58         for each in self.lineUp:
     59             if each.position[0] < -0.5:
     60                 for light in self.scene.lights:
     61                     if light.name == 'FrontMain1':
     62                         each.lightCurve.bindings[0].destinationObject = light
     63                         self.scene.curveSets.append(each.lightCurve)
     64 
     65             elif each.position[0] > 0.5:
     66                 for light in self.scene.lights:
     67                     if light.name == 'FrontMain3':
     68                         each.lightCurve.bindings[0].destinationObject = light
     69                         self.scene.curveSets.append(each.lightCurve)
     70 
     71             else:
     72                 for light in self.scene.lights:
     73                     if light.name == 'FrontMain2':
     74                         each.lightCurve.bindings[0].destinationObject = light
     75                         self.scene.curveSets.append(each.lightCurve)
     76 
     77         if callBack is not None:
     78             blue.resMan.Wait()
     79             callBack()
     80 
     81     def SetLightScene(self, lightPath, scene = None):
     82         scene = scene or self.scene
     83         lightScene = trinity.Load(lightPath)
     84         if scene:
     85             lightList = []
     86             for l in scene.lights:
     87                 lightList.append(l)
     88 
     89             for l in lightList:
     90                 scene.RemoveLightSource(l)
     91 
     92             for l in lightScene.lights:
     93                 scene.AddLightSource(l)
     94 
     95     def PositionLineUp(self):
     96         if len(self.lineUp) != 3:
     97             return
     98         POSITIONS = [(-1.4, 0.0, 0.0), (0.0, 0.0, 0.0), (1.4, 0.0, 0.0)]
     99         for i in range(3):
    100             size = 2 - i
    101             toPop = random.randint(0, size)
    102             position = POSITIONS.pop(toPop)
    103             self.lineUp[i].Translate(position)
    104 
    105     def GetGenderOrder(self, bloodlineID):
    106         for platform in self.lineUp:
    107             if platform.bloodlineID == bloodlineID:
    108                 female = platform.pair[0].avatar
    109                 male = platform.pair[1].avatar
    110                 femaleIndex = female.GetBoneIndex('Head')
    111                 if female.skinningMatrixCount > femaleIndex:
    112                     femalePosition = female.GetBonePosition(femaleIndex)
    113                 else:
    114                     femalePosition = None
    115                 maleIndex = male.GetBoneIndex('Head')
    116                 if male.skinningMatrixCount > maleIndex:
    117                     malePosition = male.GetBonePosition(maleIndex)
    118                 else:
    119                     malePosition = None
    120                 if femalePosition is not None and malePosition is not None:
    121                     return int(femalePosition < malePosition)
    122 
    123         log.LogWarn('Bloodline', bloodlineID, 'not in character lineup')
    124         return 0
    125 
    126     def GetBloodlineAndGender(self, pickedObject):
    127         for platform in self.lineUp:
    128             for i, each in enumerate(platform.pair):
    129                 if each.avatar == pickedObject:
    130                     if self.currentSelection != platform:
    131                         self.currentSelection = platform
    132                         return (platform.bloodlineID, None)
    133                     return (platform.bloodlineID, i)
    134 
    135         return (None, None)
    136 
    137     def SelectBloodline(self, bloodlineID):
    138         for platform in self.lineUp:
    139             if platform.bloodlineID == bloodlineID:
    140                 if platform.active != True:
    141                     platform.Activate()
    142             elif platform.active == True:
    143                 platform.Deactivate()
    144 
    145     def HiliteBloodline(self, hilitedBloodlines):
    146         for platform in self.lineUp:
    147             if platform.bloodlineID in hilitedBloodlines:
    148                 if platform.active != True:
    149                     platform.Activate()
    150             elif platform.active == True:
    151                 platform.Deactivate()
    152 
    153     def TearDown(self):
    154         self.race = None
    155         self.lineUp = []
    156 
    157     def GetProjectedPosition(self, bloodlineID, genderID, camera):
    158         if camera is None:
    159             return
    160         avatar = None
    161         camera.Update()
    162         for platform in self.lineUp:
    163             if platform.bloodlineID == bloodlineID:
    164                 if genderID is None:
    165                     position = geo2.Add(platform.position, (0.0, 2.0, 0.0))
    166                     return camera.ProjectPoint(position)
    167                 for i, each in enumerate(platform.pair):
    168                     if i == genderID:
    169                         avatar = each.avatar
    170 
    171         if avatar == None:
    172             log.LogError('Could not get the projected head position for character with bloodlineID %s and genderID %s', (bloodlineID, genderID))
    173             return (0, 0)
    174         index = avatar.GetBoneIndex('Head')
    175         position = avatar.GetBonePosition(index)
    176         return camera.ProjectPoint(position)
    177 
    178     class Platform(object):
    179 
    180         def __init__(self, pair, bloodlineID, poseID):
    181             self.pair = pair
    182             self.bloodlineID = bloodlineID
    183             self.poseID = poseID
    184             self.genderIcons = []
    185             self.position = (0.0, 0.0, 0.0)
    186             self.active = False
    187             self.lightCurve = trinity.Load(LIGHT_CURVE)
    188 
    189         def Translate(self, pos):
    190             self.position = pos
    191             for each in self.pair:
    192                 each.avatar.translation = pos
    193                 if pos[0] < -0.5:
    194                     each.avatar.rotation = geo2.QuaternionRotationSetYawPitchRoll(0.2, 0.0, 0.0)
    195                 elif pos[0] > 0.5:
    196                     each.avatar.rotation = geo2.QuaternionRotationSetYawPitchRoll(-0.2, 0.0, 0.0)
    197 
    198         def Activate(self):
    199             self.active = True
    200             self.lightCurve.scale = 1.0
    201             self.lightCurve.Play()
    202 
    203         def Deactivate(self):
    204             self.active = False
    205             self.lightCurve.scale = -1.0
    206             self.lightCurve.PlayFrom(0.5)