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

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