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)