charCreation.py (14316B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\login\charcreation_new\charCreation.py 2 import carbonui.const as uiconst 3 import uthread 4 import log 5 import charactercreator.const as ccConst 6 import blue 7 import trinity 8 import eve.common.lib.appConst as const 9 from carbonui.primitives.container import Container 10 from carbonui.uicore import uicore 11 from eve.client.script.ui.login.charcreation_new.assetPicker import CharCreationAssetPicker 12 from eve.client.script.ui.login.charcreation_new.sceneManager import GetCharacterCreationSceneManager 13 from eve.client.script.ui.login.charcreation_new.dollManager import GetCharacterCreationDollManager 14 MAXMENUSIZE = 380 15 CC_LEFT_SIZE = 180 16 ZONEMAP = {-1: uiconst.UICURSOR_DEFAULT, 17 0: uiconst.UICURSOR_CCALLDIRECTIONS, 18 1: uiconst.UICURSOR_CCALLDIRECTIONS, 19 2: uiconst.UICURSOR_CCALLDIRECTIONS, 20 3: uiconst.UICURSOR_CCALLDIRECTIONS, 21 4: uiconst.UICURSOR_CCALLDIRECTIONS, 22 5: uiconst.UICURSOR_CCALLDIRECTIONS, 23 6: uiconst.UICURSOR_CCALLDIRECTIONS, 24 7: uiconst.UICURSOR_CCALLDIRECTIONS, 25 8: uiconst.UICURSOR_CCALLDIRECTIONS, 26 9: uiconst.UICURSOR_CCALLDIRECTIONS, 27 10: uiconst.UICURSOR_CCALLDIRECTIONS, 28 11: uiconst.UICURSOR_CCALLDIRECTIONS, 29 12: uiconst.UICURSOR_CCALLDIRECTIONS, 30 13: uiconst.UICURSOR_CCALLDIRECTIONS, 31 14: uiconst.UICURSOR_CCUPDOWN, 32 15: uiconst.UICURSOR_CCALLDIRECTIONS, 33 16: uiconst.UICURSOR_CCALLDIRECTIONS, 34 17: uiconst.UICURSOR_CCLEFTRIGHT} 35 ZONEMAP_SIDE = {-1: uiconst.UICURSOR_DEFAULT, 36 0: uiconst.UICURSOR_CCALLDIRECTIONS, 37 1: uiconst.UICURSOR_CCALLDIRECTIONS, 38 2: uiconst.UICURSOR_CCALLDIRECTIONS, 39 3: uiconst.UICURSOR_CCALLDIRECTIONS, 40 4: uiconst.UICURSOR_CCALLDIRECTIONS, 41 5: uiconst.UICURSOR_CCALLDIRECTIONS, 42 6: uiconst.UICURSOR_CCALLDIRECTIONS, 43 7: uiconst.UICURSOR_CCALLDIRECTIONS, 44 8: uiconst.UICURSOR_CCALLDIRECTIONS, 45 9: uiconst.UICURSOR_CCALLDIRECTIONS, 46 10: uiconst.UICURSOR_CCALLDIRECTIONS, 47 11: uiconst.UICURSOR_CCALLDIRECTIONS, 48 12: uiconst.UICURSOR_CCALLDIRECTIONS, 49 13: uiconst.UICURSOR_CCALLDIRECTIONS, 50 14: uiconst.UICURSOR_CCUPDOWN, 51 15: uiconst.UICURSOR_CCALLDIRECTIONS, 52 16: uiconst.UICURSOR_CCALLDIRECTIONS, 53 17: uiconst.UICURSOR_DEFAULT} 54 ZONEMAP_ANIM = {-1: uiconst.UICURSOR_DEFAULT, 55 0: uiconst.UICURSOR_CCHEADALL, 56 1: uiconst.UICURSOR_CCHEADALL, 57 2: uiconst.UICURSOR_CCHEADALL, 58 3: uiconst.UICURSOR_CCALLDIRECTIONS, 59 4: uiconst.UICURSOR_CCHEADTILT, 60 5: uiconst.UICURSOR_CCALLDIRECTIONS, 61 6: uiconst.UICURSOR_CCALLDIRECTIONS, 62 7: uiconst.UICURSOR_CCHEADALL, 63 8: uiconst.UICURSOR_CCHEADALL, 64 9: uiconst.UICURSOR_CCALLDIRECTIONS, 65 10: uiconst.UICURSOR_CCALLDIRECTIONS, 66 11: uiconst.UICURSOR_CCHEADTILT, 67 12: uiconst.UICURSOR_CCHEADALL, 68 13: uiconst.UICURSOR_CCHEADALL, 69 14: uiconst.UICURSOR_CCHEADALL, 70 15: uiconst.UICURSOR_CCALLDIRECTIONS, 71 16: uiconst.UICURSOR_CCALLDIRECTIONS, 72 17: uiconst.UICURSOR_CCALLDIRECTIONS} 73 ZONEMAP_ANIMBODY = {-1: uiconst.UICURSOR_DEFAULT, 74 3: uiconst.UICURSOR_CCSHOULDERTWIST, 75 4: uiconst.UICURSOR_CCSHOULDERTWIST, 76 5: uiconst.UICURSOR_CCSHOULDERTWIST, 77 6: uiconst.UICURSOR_CCSHOULDERTWIST} 78 GHOST_TEXTURE_PATH = 'res:/UI/Texture/CharacterCreation/silhuette_ghost.dds' 79 80 class BaseCharacterCreationStep(Container): 81 __guid__ = 'uicls.BaseCharacterCreationStep' 82 __notifyevents__ = ['OnHideUI', 'OnShowUI', 'OnUIScalingChange'] 83 default_align = uiconst.TOALL 84 default_state = uiconst.UI_NORMAL 85 racialHeader = {const.raceCaldari: 384, 86 const.raceMinmatar: 128, 87 const.raceAmarr: 256, 88 const.raceGallente: 0} 89 raceHeaderPath = 'res:/UI/Texture/CharacterCreation/RACE_Titletext.dds' 90 raceFontColor = {const.raceCaldari: (0.93, 0.94, 0.99, 1.0), 91 const.raceMinmatar: (0.99, 0.95, 0.95, 1.0), 92 const.raceAmarr: (0.99, 0.95, 0.92, 1.0), 93 const.raceGallente: (0.99, 0.99, 0.92, 1.0)} 94 95 def ApplyAttributes(self, attributes): 96 sm.RegisterNotify(self) 97 Container.ApplyAttributes(self, attributes) 98 self.charSvc = sm.GetService('character') 99 self._cameraActive = False 100 self._activeSculptZone = None 101 self._didSculptMotion = False 102 self._latestPickTime = None 103 self.uiContainer = Container(name='uiContainer', parent=self, align=uiconst.TOALL) 104 self.leftSide = Container(name='leftSide', parent=self.uiContainer, align=uiconst.TOLEFT_PROP, width=0.5) 105 self.rightSide = Container(name='rightSide', parent=self.uiContainer, align=uiconst.TORIGHT_PROP, width=0.5) 106 settings.user.ui.Get('assetMenuState', {ccConst.BODYGROUP: True}) 107 108 def GetInfo(self): 109 return uicore.layer.charactercreation.controller.GetInfo() 110 111 def ValidateStepComplete(self): 112 return True 113 114 def GetPickInfo(self, pos): 115 layer = uicore.layer.charactercreation.controller 116 layer.StartEditMode(mode='makeup', skipPickSceneReset=True, useThread=0) 117 pickedMakeup = layer.PassMouseEventToSculpt('LeftDown', *pos) 118 layer.StartEditMode(mode='hair', skipPickSceneReset=True, useThread=0) 119 pickedHair = layer.PassMouseEventToSculpt('LeftDown', *pos) 120 layer.StartEditMode(mode='bodyselect', skipPickSceneReset=True, useThread=0) 121 pickedBody = layer.PassMouseEventToSculpt('LeftDown', *pos) 122 layer.StartEditMode(mode='sculpt', skipPickSceneReset=True, useThread=0) 123 pickedSculpt = layer.PassMouseEventToSculpt('LeftDown', *pos) 124 reset = layer.PassMouseEventToSculpt('LeftUp', *pos) 125 return (pickedMakeup, 126 pickedHair, 127 pickedBody, 128 pickedSculpt) 129 130 def OnMouseDown(self, btn, *args): 131 if self.stepID in (ccConst.CUSTOMIZATIONSTEP, ccConst.PORTRAITSTEP): 132 self.storedMousePos = None 133 pos = (int(uicore.uilib.x * uicore.desktop.dpiScaling), int(uicore.uilib.y * uicore.desktop.dpiScaling)) 134 layer = uicore.layer.charactercreation.controller 135 if btn == uiconst.MOUSERIGHT: 136 self._cameraActive = True 137 self._SetActiveSculptZone(None) 138 elif btn == uiconst.MOUSELEFT and not self._cameraActive and self.charSvc.IsSculptingReady(): 139 self._didSculptMotion = False 140 self._latestPickTime = blue.os.GetWallclockTime() 141 if self.CanSculpt(): 142 layer.StartEditMode(mode='sculpt', callback=self.ChangeSculptingCursor) 143 pickedSculpt = layer.PassMouseEventToSculpt('LeftDown', *pos) 144 if pickedSculpt >= 0: 145 uicore.layer.charactercreation.controller.TryFreezeAnimation() 146 self.storedMousePos = (uicore.uilib.x, uicore.uilib.y) 147 self.cursor = uiconst.UICURSOR_NONE 148 self._cameraActive = False 149 self._SetActiveSculptZone(pickedSculpt) 150 else: 151 self._cameraActive = True 152 self._SetActiveSculptZone(None) 153 elif self.stepID == ccConst.PORTRAITSTEP: 154 info = self.GetInfo() 155 self.charSvc.StartPosing(info.charID, callback=self.ChangeSculptingCursor) 156 pickedSculpt = layer.PassMouseEventToSculpt('LeftDown', *pos) 157 if pickedSculpt >= 0: 158 self._cameraActive = False 159 self._SetActiveSculptZone(pickedSculpt) 160 else: 161 self._cameraActive = True 162 self._SetActiveSculptZone(None) 163 else: 164 self._cameraActive = True 165 self._SetActiveSculptZone(None) 166 elif btn == uiconst.MOUSELEFT and self.stepID == ccConst.CUSTOMIZATIONSTEP and not layer.CanChangeBaseAppearance(): 167 self._cameraActive = True 168 else: 169 return 170 uicore.uilib.ClipCursor(0, 0, uicore.desktop.width, uicore.desktop.height) 171 uicore.uilib.SetCapture(self) 172 173 def OnMouseUp(self, btn, *args): 174 if self.stepID in (ccConst.CUSTOMIZATIONSTEP, ccConst.PORTRAITSTEP): 175 uicore.layer.charactercreation.controller.UnfreezeAnimationIfNeeded() 176 if getattr(self, 'storedMousePos', None) is not None: 177 uicore.uilib.SetCursorPos(*self.storedMousePos) 178 self.storedMousePos = None 179 if btn == uiconst.MOUSELEFT: 180 uicore.layer.charactercreation.controller.PassMouseEventToSculpt('LeftUp', uicore.uilib.x, uicore.uilib.y) 181 if self.CanSculpt(): 182 if self._activeSculptZone is not None and self._didSculptMotion: 183 uicore.layer.charactercreation.controller.TryStoreDna(False, 'Sculpting', sculpting=True) 184 charID = uicore.layer.charactercreation.controller.GetInfo().charID 185 sm.ScatterEvent('OnDollUpdated', charID, False, 'sculpting') 186 self.charSvc.UpdateTattoos(charID) 187 elif self._latestPickTime: 188 if blue.os.TimeDiffInMs(self._latestPickTime, blue.os.GetWallclockTime()) < 250.0: 189 pickedMakeup, pickedHair, pickedBody, pickedSculpt = self.GetPickInfo((uicore.uilib.x, uicore.uilib.y)) 190 log.LogInfo('Pickinfo: makeup, hair, bodyselect, sculpt = ', pickedMakeup, pickedHair, pickedBody, pickedSculpt) 191 for each in (('hair', pickedHair), 192 ('makeup', pickedMakeup), 193 ('clothes', pickedBody), 194 ('sculpt', pickedSculpt)): 195 if each in ccConst.PICKMAPPING: 196 pickedModifier = ccConst.PICKMAPPING[each] 197 self.ExpandMenuByModifier(pickedModifier) 198 break 199 200 self._SetActiveSculptZone(None) 201 if not uicore.uilib.rightbtn and not uicore.uilib.leftbtn: 202 uicore.layer.charactercreation.controller.PassMouseEventToSculpt('Motion', uicore.uilib.x, uicore.uilib.y) 203 self._cameraActive = False 204 self._SetActiveSculptZone(None) 205 self.cursor = uiconst.UICURSOR_DEFAULT 206 uicore.uilib.UnclipCursor() 207 if uicore.uilib.GetCapture() is self: 208 uicore.uilib.ReleaseCapture() 209 210 def OnMouseMove(self, *args): 211 if self.stepID not in (ccConst.CUSTOMIZATIONSTEP, ccConst.PORTRAITSTEP): 212 return 213 pos = (int(uicore.uilib.x * uicore.desktop.dpiScaling), int(uicore.uilib.y * uicore.desktop.dpiScaling)) 214 ccSceneManager = GetCharacterCreationSceneManager() 215 if self._cameraActive: 216 if uicore.uilib.leftbtn and uicore.uilib.rightbtn: 217 modifier = uicore.mouseInputHandler.GetCameraZoomModifier() 218 ccSceneManager.camera.Dolly(modifier * uicore.uilib.dy) 219 if uicore.uilib.leftbtn: 220 ccSceneManager.camera.AdjustYaw(uicore.uilib.dx) 221 if not uicore.uilib.rightbtn: 222 ccSceneManager.camera.AdjustPitch(uicore.uilib.dy) 223 elif uicore.uilib.rightbtn: 224 ccSceneManager.camera.Pan(uicore.uilib.dx, uicore.uilib.dy) 225 else: 226 if self._activeSculptZone is not None and self.stepID == ccConst.CUSTOMIZATIONSTEP: 227 GetCharacterCreationDollManager().CheckDnaLog() 228 self._didSculptMotion = True 229 uicore.layer.charactercreation.controller.PassMouseEventToSculpt('Motion', *pos) 230 231 def OnMouseWheel(self, *args): 232 ccSceneManager = GetCharacterCreationSceneManager() 233 if not ccSceneManager.camera: 234 return 235 modifier = uicore.mouseInputHandler.GetCameraZoomModifier() 236 ccSceneManager.camera.Dolly(modifier * -uicore.uilib.dz) 237 238 def ChangeSculptingCursor(self, zone, isFront, isHead): 239 if self.destroyed: 240 return 241 if self.stepID == ccConst.CUSTOMIZATIONSTEP: 242 if isFront: 243 cursor = ZONEMAP.get(zone, uiconst.UICURSOR_DEFAULT) 244 else: 245 cursor = ZONEMAP_SIDE.get(zone, uiconst.UICURSOR_DEFAULT) 246 self.cursor = cursor 247 elif self.stepID == ccConst.PORTRAITSTEP: 248 if isHead: 249 cursor = ZONEMAP_ANIM.get(zone, uiconst.UICURSOR_DEFAULT) 250 else: 251 cursor = ZONEMAP_ANIMBODY.get(zone, uiconst.UICURSOR_DEFAULT) 252 self.cursor = cursor 253 lastZone = getattr(self, '_lastZone', None) 254 if lastZone != zone: 255 sm.StartService('audio').SendUIEvent(unicode('ui_icc_sculpting_mouse_over_loop_play')) 256 self._lastZone = zone 257 if self._lastZone == -1: 258 sm.StartService('audio').SendUIEvent(unicode('ui_icc_sculpting_mouse_over_loop_stop')) 259 260 def ExpandMenuByModifier(self, modifier): 261 if not self.assetMenu: 262 return 263 lastParentGroup = None 264 allMenus = [ each for each in self.assetMenu.mainContainter.children if isinstance(each, CharCreationAssetPicker) ] 265 for menu in allMenus: 266 if not menu.isSubmenu: 267 lastParentGroup = menu 268 if getattr(menu, 'modifier', None) == modifier: 269 if lastParentGroup and not lastParentGroup.IsExpanded(): 270 uthread.new(lastParentGroup.Expand) 271 uthread.new(menu.Expand) 272 273 def OnHideUI(self, *args): 274 self.uiContainer.state = uiconst.UI_HIDDEN 275 276 def OnShowUI(self, *args): 277 self.uiContainer.state = uiconst.UI_PICKCHILDREN 278 279 def CanSculpt(self, *args): 280 return self.stepID == ccConst.CUSTOMIZATIONSTEP and uicore.layer.charactercreation.controller.CanChangeBaseAppearance() and getattr(self, 'menuMode', None) != getattr(self, 'TATTOOMENU', None) 281 282 def IsDollReady(self, *args): 283 info = self.GetInfo() 284 ccDollManager = GetCharacterCreationDollManager() 285 if ccDollManager.GetDoll(info.charID) is None: 286 return False 287 return not ccDollManager.GetDoll(info.charID).busyUpdating 288 289 def GetViewportForPicking(self): 290 return trinity.device.viewport 291 292 def _SetActiveSculptZone(self, sculptZone): 293 self._activeSculptZone = sculptZone