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

animparams.py (23527B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\charactercreator\client\animparams.py
      2 from __future__ import absolute_import
      3 import trinity
      4 import uthread
      5 from carbonui.uicore import uicore
      6 import blue
      7 from .animparams_const import *
      8 import log
      9 
     10 class AnimParams(object):
     11 
     12     def __init__(self, avatar, charID = None, doll = None, factory = None):
     13         self.factory = factory
     14         self.doll = doll
     15         self.id_to_value_dict = {}
     16         id_to_name = list(enumerate(CONTROL_PARAM_LIST))
     17         self.id_to_name_dict = dict(id_to_name)
     18         ids, names = zip(*id_to_name)
     19         self.name_to_id_dict = dict(zip(names, ids))
     20         self.update = True
     21         self.last_id = max(ids)
     22         self.avatar = avatar
     23         self.rebuilding = False
     24         self.lastNetworkMode = -1
     25         self.lastPortraitPose = -1
     26         if charID is None:
     27             if hasattr(uicore, 'layer'):
     28                 self.charID = uicore.layer.charactercreation.controller.GetInfo().charID
     29             else:
     30                 self.charID = 0
     31         else:
     32             self.charID = charID
     33         self.characterSvc = sm.GetServiceIfRunning('character')
     34         gender = avatar.visualModel.geometryResPath.lower()
     35         for param in ccconst.FACE_POSE_CONTROLPARAMS:
     36             self.InitParameter(param[0], param[1])
     37 
     38         if 'female' in gender:
     39             self.InitParameter('ControlParameters|HeadLookTarget', (0.0, 1.5, 0.5))
     40         else:
     41             self.InitParameter('ControlParameters|HeadLookTarget', (0.0, 1.6, 0.5))
     42         self.InitParameter('ControlParameters|PuckerLips', 0.0)
     43         self.InitParameter('ControlParameters|IsAlive', 1)
     44         self.InitParameter('ControlParameters|NetworkMode', 1)
     45 
     46     def InitParameter(self, name, value):
     47         if name not in self.name_to_id_dict:
     48             self.last_id += 1
     49             self.name_to_id_dict[name] = self.last_id
     50             self.id_to_name_dict[self.last_id] = name
     51         self.id_to_value_dict[self.name_to_id_dict[name]] = value
     52 
     53     def SetControlParameter(self, name, value):
     54         if name not in self.name_to_id_dict:
     55             self.last_id += 1
     56             self.name_to_id_dict[name] = self.last_id
     57             self.id_to_name_dict[self.last_id] = name
     58         if value != self.id_to_value_dict.get(self.name_to_id_dict[name]):
     59             self.id_to_value_dict[self.name_to_id_dict[name]] = value
     60         self.ProcessControlParameter(self.name_to_id_dict[name])
     61 
     62     def GetControlParameter(self, name):
     63         if name in self.name_to_id_dict:
     64             if self.name_to_id_dict[name] not in self.id_to_value_dict:
     65                 self.id_to_value_dict[self.name_to_id_dict[name]] = 0.0
     66             return self.id_to_value_dict[self.name_to_id_dict[name]]
     67 
     68     def GetControlParameterValue(self, name):
     69         return self.GetControlParameter(name)
     70 
     71     def SetControlParameterByID(self, id, args):
     72         self.id_to_value_dict[id] = args
     73         if id > self.last_id:
     74             self.last_id = id
     75         self.ProcessControlParameter(id)
     76 
     77     def GetControlParameterValueByID(self, id):
     78         if id not in self.id_to_value_dict:
     79             self.id_to_value_dict[id] = 0.0
     80         return self.id_to_value_dict[id]
     81 
     82     def GetControlParameterName(self, id):
     83         for name in self.name_to_id_dict:
     84             if id == self.name_to_id_dict[name]:
     85                 return name
     86 
     87         return 'Unknown'
     88 
     89     def GetControlParameterID(self, name):
     90         return self.name_to_id_dict[name]
     91 
     92     def GetAllControlParameters(self):
     93         return self.name_to_id_dict
     94 
     95     def GetAllEventIDs(self):
     96         return {}
     97 
     98     def GetAllRequestIDs(self):
     99         return {}
    100 
    101     def GetRequests(self):
    102         return []
    103 
    104     def GetAllEventTrackIDs(self):
    105         return {}
    106 
    107     def ProcessControlParameter(self, id):
    108         value = self.id_to_value_dict.get(id)
    109         if value is None:
    110             return
    111         if '|NetworkMode' in self.id_to_name_dict[id]:
    112             log.LogWarn('Setting network mode to %s' % value)
    113             if value == NETWORKMODE_PORTRAIT and type(self.avatar.animationUpdater) != trinity.Tr2GrannyAnimation:
    114                 self.Rebuild()
    115             elif value != NETWORKMODE_PORTRAIT and type(self.avatar.animationUpdater) != trinity.Tr2GStateAnimation:
    116                 self.Rebuild()
    117         if '|PortraitPoseNumber' in self.id_to_name_dict[id]:
    118             if self.GetControlParameter('ControlParameters|NetworkMode') == 2:
    119                 self.Rebuild()
    120         if '|OrientChar' in self.id_to_name_dict[id]:
    121             uthread.new(BaseParamHandler, value, self)
    122         if '|BrowLeftCurl' in self.id_to_name_dict[id]:
    123             uthread.new(TwoLayerParamHandler, value, self, 'ControlParameters|BrowLeftCurlDown', 'ControlParameters|BrowLeftCurlUp')
    124         if '|BrowRightCurl' in self.id_to_name_dict[id]:
    125             uthread.new(TwoLayerParamHandler, value, self, 'ControlParameters|BrowRightCurlDown', 'ControlParameters|BrowRightCurlUp')
    126         if '|BrowLeftUpDown' in self.id_to_name_dict[id]:
    127             uthread.new(TwoLayerParamHandler, value, self, 'ControlParameters|BrowLeftDown', 'ControlParameters|BrowLeftUp')
    128         if '|BrowRightUpDown' in self.id_to_name_dict[id]:
    129             uthread.new(TwoLayerParamHandler, value, self, 'ControlParameters|BrowRightDown', 'ControlParameters|BrowRightUp')
    130         if '|BrowLeftTighten' in self.id_to_name_dict[id]:
    131             uthread.new(OneLayerParamHandler, value, self, 'ControlParameters|BrowLeftTighten')
    132         if '|BrowRightTighten' in self.id_to_name_dict[id]:
    133             uthread.new(OneLayerParamHandler, value, self, 'ControlParameters|BrowRightTighten')
    134         if '|SquintLeft' in self.id_to_name_dict[id]:
    135             uthread.new(OneLayerParamHandler, value, self, 'ControlParameters|SquintLeft')
    136         if '|SquintRight' in self.id_to_name_dict[id]:
    137             uthread.new(OneLayerParamHandler, value, self, 'ControlParameters|SquintRight')
    138         if '|FrownLeft' in self.id_to_name_dict[id]:
    139             uthread.new(OneLayerParamHandler, value, self, 'ControlParameters|FrownLeft')
    140         if '|FrownRight' in self.id_to_name_dict[id]:
    141             uthread.new(OneLayerParamHandler, value, self, 'ControlParameters|FrownRight')
    142         if '|SmileLeft' in self.id_to_name_dict[id]:
    143             uthread.new(OneLayerParamHandler, value, self, 'ControlParameters|SmileLeft')
    144         if '|SmileRight' in self.id_to_name_dict[id]:
    145             uthread.new(OneLayerParamHandler, value, self, 'ControlParameters|SmileRight')
    146         if '|HeadTilt' in self.id_to_name_dict[id]:
    147             scaled_value = (value + 1.0) / 2.0
    148             uthread.new(TwoLayerParamHandler, scaled_value, self, 'ControlParameters|TiltHeadRight', 'ControlParameters|TiltHeadLeft')
    149         if '|JawSideways' in self.id_to_name_dict[id]:
    150             uthread.new(TwoLayerParamHandler, value, self, 'ControlParameters|JawRight', 'ControlParameters|JawLeft')
    151         if '|JawUp' in self.id_to_name_dict[id]:
    152             inv_value = 1 - 2 * value
    153             uthread.new(OneLayerParamHandler, inv_value, self, 'ControlParameters|JawDown')
    154         if '|EyesLookVertical' in self.id_to_name_dict[id]:
    155             uthread.new(TwoLayerParamHandler, value, self, 'ControlParameters|EyesLookDown', 'ControlParameters|EyesLookUp')
    156         if '|EyesLookHorizontal' in self.id_to_name_dict[id]:
    157             uthread.new(TwoLayerParamHandler, value, self, 'ControlParameters|EyesLookRight', 'ControlParameters|EyesLookLeft')
    158         if '|EyeClose' in self.id_to_name_dict[id]:
    159             uthread.new(OneLayerParamHandler, value, self, 'ControlParameters|EyesClose')
    160         if '|HeadLookTarget' in self.id_to_name_dict[id]:
    161             uthread.new(HeadLookTargetHandler, value, self)
    162         if '|HeadLookLeftRight' in self.id_to_name_dict[id]:
    163             uthread.new(HeadLookLeftRightHandler, value, self)
    164         if '|HeadLookUpDown' in self.id_to_name_dict[id]:
    165             uthread.new(HeadLookUpDownHandler, value, self)
    166         if '|CameraDistance' in self.id_to_name_dict[id]:
    167             uthread.new(CameraDistanceHandler, value, self)
    168         if '|IsAlive' in self.id_to_name_dict[id]:
    169             uthread.new(IsAliveHandler, value, self)
    170 
    171     def Rebuild(self):
    172         self.rebuilding = True
    173         uthread.new(RebuildAnimationNode, self)
    174 
    175 
    176 def RebuildAnimationNode(animparams):
    177     network_mode = animparams.GetControlParameter('ControlParameters|NetworkMode')
    178     if network_mode == NETWORKMODE_PORTRAIT:
    179         RebuildAnimationNodePortrait(animparams)
    180     else:
    181         RebuildAnimationNodeNonPortrait(animparams)
    182 
    183 
    184 def RebuildAnimationNodePortrait(animparams):
    185     if 'female' in animparams.avatar.visualModel.geometryResPath.lower():
    186         gender_name = 'Female'
    187     else:
    188         gender_name = 'Male'
    189     posenum = animparams.GetControlParameter('ControlParameters|PortraitPoseNumber') + 1
    190     animation = SetupAnimationNode()
    191     pose_res_list = BuildPortraitPoses(animation, gender_name, posenum)
    192     trinity.WaitForResourceLoads()
    193     PlayBaseAnimation(animation)
    194     PlaySecondaryPoseAnimations(animation, pose_res_list)
    195     animparams.avatar.animationUpdater = animation
    196     CreateGrannyBoneOffsets(animparams)
    197     animation.animationEnabled = True
    198     animparams.rebuilding = False
    199     param_dict = animparams.GetAllControlParameters()
    200     InitalizeControlParameters(animparams, param_dict)
    201     CheckAndSetPosingState(animparams)
    202 
    203 
    204 def RebuildAnimationNodeNonPortrait(animparams):
    205     if animparams.avatar.visualModel is None:
    206         animparams.rebuilding = False
    207         return
    208     if 'female' in animparams.avatar.visualModel.geometryResPath.lower():
    209         gender_name = 'Female'
    210     else:
    211         gender_name = 'Male'
    212     animation = SetupGStateNode()
    213     LoadNonPortraitAnimations(animation, gender_name)
    214     animparams.avatar.animationUpdater = animation
    215     animation.animationEnabled = True
    216     animparams.rebuilding = False
    217     CheckAndSetSculptingState(animparams)
    218 
    219 
    220 def LoadNonPortraitAnimations(animation, gender_name):
    221     pose_base_path = 'res:\\Animation\\CharacterCreatorV2\\GState\\CharacterCreator_Gstate_%s_Master.gsf' % gender_name
    222     animation.gStateResPath = pose_base_path
    223     log.LogNotice('Resetting gStateResPath')
    224     trinity.WaitForResourceLoads()
    225     while not animation.IsFullyLoaded():
    226         blue.synchro.Yield()
    227 
    228     animation.InstantiateCharacter()
    229 
    230 
    231 def CheckAndSetSculptingState(animparams):
    232     if hasattr(uicore, 'layer') and hasattr(uicore.layer, 'charactercreation') and getattr(uicore.layer.charactercreation, 'isopen', 0):
    233         if uicore.layer.state is not None and uicore.layer.state == 0:
    234             if getattr(uicore.layer.charactercreation.controller, 'stepID', 0) in [ccconst.BLOODLINESTEP,
    235              ccconst.CUSTOMIZATIONSTEP,
    236              ccconst.PORTRAITSTEP,
    237              ccconst.DOLLSTEP]:
    238                 if animparams.characterSvc:
    239                     animparams.characterSvc.StartPosing(animparams.charID)
    240 
    241 
    242 def PortraitSetupFaceAnimLayer(animation, face_pose_res_path):
    243     animation.AddAnimationLayer('face', 1.0)
    244     face_clip = animation.GetSecondaryAnimationName(face_pose_res_path, 0)
    245     for bone in FACE_POSE_BONELIST:
    246         animation.AddAnimationLayerBone('face', bone)
    247 
    248     animation.PlayLayerAnimation('face', face_clip, True, 0, 0, 1.0, False)
    249 
    250 
    251 def PortraitSetupBodyAnimLayer(animation, body_pose_res_path):
    252     animation.AddAnimationLayer('body', 1.0)
    253     body_clip = animation.GetSecondaryAnimationName(body_pose_res_path, 0)
    254     animation.AddAnimationLayerAllBones('body')
    255     for bone in FACE_POSE_BONELIST:
    256         animation.RemoveAnimationLayerBone('body', bone)
    257 
    258     animation.PlayLayerAnimation('body', body_clip, True, 0, 0, 1.0, False)
    259 
    260 
    261 def CheckAndSetPosingState(animparams):
    262     if animparams.characterSvc and hasattr(uicore, 'layer'):
    263         if animparams.characterSvc.sculpting is not None:
    264             animparams.characterSvc.sculpting.Stop()
    265         animparams.characterSvc.StartPosing(animparams.charID)
    266 
    267 
    268 def InitalizeControlParameters(animparams, param_dict):
    269     for name in param_dict:
    270         if '|NetworkMode' not in name and '|PortraitPoseNumber' not in name:
    271             animparams.ProcessControlParameter(param_dict[name])
    272 
    273 
    274 def PlayBaseAnimation(animation):
    275     baseclip = animation.grannyRes.GetAnimationName(0)
    276     animation.PlayAnimationEx(baseclip, 0, 0, 0.0)
    277 
    278 
    279 def SetupAnimationNode():
    280     animation = trinity.Tr2GrannyAnimation()
    281     animation.animationEnabled = False
    282     return animation
    283 
    284 
    285 def SetupGStateNode():
    286     animation = trinity.Tr2GStateAnimation()
    287     animation.animationEnabled = False
    288     return animation
    289 
    290 
    291 def GetParamsPerAvatar(avatar, charID = None, doll = None, factory = None):
    292     avatar_id = id(avatar)
    293     if avatar_id not in PARAMS_PER_AVATAR:
    294         PARAMS_PER_AVATAR[avatar_id] = AnimParams(avatar, charID, doll, factory)
    295     return PARAMS_PER_AVATAR[avatar_id]
    296 
    297 
    298 def AddPose(animation, pose_res_list, res_path, param_name, default_value, default_weight = 1.0, bone_list = []):
    299     animation.AddSecondaryResPath(res_path)
    300     pose_res_list.append((res_path,
    301      param_name,
    302      default_value,
    303      default_weight,
    304      bone_list))
    305 
    306 
    307 def AddIdle(animation, pose_res_list, res_path):
    308     animation.AddSecondaryResPath(res_path)
    309     pose_res_list.append((res_path,
    310      'idle',
    311      None,
    312      1.0,
    313      IDLE_POSE_BONELIST))
    314 
    315 
    316 def BuildPortraitPoses(animation, gender_name, posenum):
    317     animation.SetAdditiveBlendMode(True)
    318     pose_res_list = []
    319     base_pose_res_path = 'res:/Animation/PortraitCreator/%s/CharacterCreation/Portrait_Pose_Base%d.gr2' % (gender_name, posenum)
    320     animation.resPath = base_pose_res_path
    321     animation.SetLayerControlParam('', 0.5)
    322     idle_pose_res_path = 'res:/Animation/PortraitCreator/Female/CharacterCreation/Portrait_Idle_Additive_FullBody.gr2'
    323     AddIdle(animation, pose_res_list, idle_pose_res_path)
    324     AddPose(animation, pose_res_list, 'res:\\Animation\\PortraitCreator\\Female\\Common\\Util_BrowLeftCurlDown.gr2', 'ControlParameters|BrowLeftCurlDown', 0.0, 1.0, FACE_POSE_BROW_LEFT_BONELIST)
    325     AddPose(animation, pose_res_list, 'res:\\Animation\\PortraitCreator\\Female\\Common\\Util_BrowLeftCurlUp.gr2', 'ControlParameters|BrowLeftCurlUp', 0.0, 1.0, FACE_POSE_BROW_LEFT_BONELIST)
    326     AddPose(animation, pose_res_list, 'res:\\Animation\\PortraitCreator\\Female\\Common\\Util_BrowLeftDown.gr2', 'ControlParameters|BrowLeftDown', 0.0, 1.0, FACE_POSE_BROW_LEFT_BONELIST)
    327     AddPose(animation, pose_res_list, 'res:\\Animation\\PortraitCreator\\Female\\Common\\Util_BrowLeftUp.gr2', 'ControlParameters|BrowLeftUp', 0.0, 1.0, FACE_POSE_BROW_LEFT_BONELIST)
    328     AddPose(animation, pose_res_list, 'res:\\Animation\\PortraitCreator\\Female\\Common\\Util_BrowLeftTighten.gr2', 'ControlParameters|BrowLeftTighten', 0.0, 1.0, FACE_POSE_BROW_LEFT_BONELIST)
    329     AddPose(animation, pose_res_list, 'res:\\Animation\\PortraitCreator\\Female\\Common\\Util_BrowRightCurlDown.gr2', 'ControlParameters|BrowRightCurlDown', 0.0, 1.0, FACE_POSE_BROW_RIGHT_BONELIST)
    330     AddPose(animation, pose_res_list, 'res:\\Animation\\PortraitCreator\\Female\\Common\\Util_BrowRightCurlUp.gr2', 'ControlParameters|BrowRightCurlUp', 0.0, 1.0, FACE_POSE_BROW_RIGHT_BONELIST)
    331     AddPose(animation, pose_res_list, 'res:\\Animation\\PortraitCreator\\Female\\Common\\Util_BrowRightDown.gr2', 'ControlParameters|BrowRightDown', 0.0, 1.0, FACE_POSE_BROW_RIGHT_BONELIST)
    332     AddPose(animation, pose_res_list, 'res:\\Animation\\PortraitCreator\\Female\\Common\\Util_BrowRightUp.gr2', 'ControlParameters|BrowRightUp', 0.0, 1.0, FACE_POSE_BROW_RIGHT_BONELIST)
    333     AddPose(animation, pose_res_list, 'res:\\Animation\\PortraitCreator\\Female\\Common\\Util_BrowRightTighten.gr2', 'ControlParameters|BrowRightTighten', 0.0, 1.0, FACE_POSE_BROW_RIGHT_BONELIST)
    334     AddPose(animation, pose_res_list, 'res:\\Animation\\PortraitCreator\\Female\\Common\\Util_EyesClose.gr2', 'ControlParameters|EyesClose', 0.0, 1.0, FACE_POSE_EYE_CLOSED_BONELIST)
    335     AddPose(animation, pose_res_list, 'res:\\Animation\\PortraitCreator\\Female\\Common\\Util_EyesLookDown.gr2', 'ControlParameters|EyesLookDown', 0.0, 1.0, FACE_POSE_EYE_LOOK_BONELIST)
    336     AddPose(animation, pose_res_list, 'res:\\Animation\\PortraitCreator\\Female\\Common\\Util_EyesLookLeft.gr2', 'ControlParameters|EyesLookLeft', 0.0, 1.0, FACE_POSE_EYE_LOOK_BONELIST)
    337     AddPose(animation, pose_res_list, 'res:\\Animation\\PortraitCreator\\Female\\Common\\Util_EyesLookRight.gr2', 'ControlParameters|EyesLookRight', 0.0, 1.0, FACE_POSE_EYE_LOOK_BONELIST)
    338     AddPose(animation, pose_res_list, 'res:\\Animation\\PortraitCreator\\Female\\Common\\Util_EyesLookUp.gr2', 'ControlParameters|EyesLookUp', 0.0, 1.0, FACE_POSE_EYE_LOOK_BONELIST)
    339     AddPose(animation, pose_res_list, 'res:\\Animation\\PortraitCreator\\Female\\Common\\Util_FrownLeft.gr2', 'ControlParameters|FrownLeft', 0.0, 1.0, FACE_POSE_FROWN_LEFT_BONELIST)
    340     AddPose(animation, pose_res_list, 'res:\\Animation\\PortraitCreator\\Female\\Common\\Util_FrownRight.gr2', 'ControlParameters|FrownRight', 0.0, 1.0, FACE_POSE_FROWN_RIGHT_BONELIST)
    341     AddPose(animation, pose_res_list, 'res:\\Animation\\PortraitCreator\\Female\\Common\\Util_JawDown.gr2', 'ControlParameters|JawDown', 0.0, 1.0, FACE_POSE_JAW_BONELIST)
    342     AddPose(animation, pose_res_list, 'res:\\Animation\\PortraitCreator\\Female\\Common\\Util_JawLeft.gr2', 'ControlParameters|JawLeft', 0.0, 1.0, FACE_POSE_JAW_BONELIST)
    343     AddPose(animation, pose_res_list, 'res:\\Animation\\PortraitCreator\\Female\\Common\\Util_JawRight.gr2', 'ControlParameters|JawRight', 0.0, 1.0, FACE_POSE_JAW_BONELIST)
    344     AddPose(animation, pose_res_list, 'res:\\Animation\\PortraitCreator\\Female\\Common\\Util_JawUp.gr2', 'ControlParameters|JawUp', 0.0, 1.0, FACE_POSE_JAW_BONELIST)
    345     AddPose(animation, pose_res_list, 'res:\\Animation\\PortraitCreator\\Female\\Common\\Util_SmileLeft.gr2', 'ControlParameters|SmileLeft', 0.0, 1.0, FACE_POSE_SMILE_LEFT_BONELIST)
    346     AddPose(animation, pose_res_list, 'res:\\Animation\\PortraitCreator\\Female\\Common\\Util_SmileRight.gr2', 'ControlParameters|SmileRight', 0.0, 1.0, FACE_POSE_SMILE_RIGHT_BONELIST)
    347     AddPose(animation, pose_res_list, 'res:\\Animation\\PortraitCreator\\Female\\Common\\Util_SquintLeft.gr2', 'ControlParameters|SquintLeft', 0.0, 1.0, FACE_POSE_SQUINT_LEFT_BONELIST)
    348     AddPose(animation, pose_res_list, 'res:\\Animation\\PortraitCreator\\Female\\Common\\Util_SquintRight.gr2', 'ControlParameters|SquintRight', 0.0, 1.0, FACE_POSE_SQUINT_RIGHT_BONELIST)
    349     AddPose(animation, pose_res_list, 'res:\\Animation\\PortraitCreator\\Female\\Common\\Util_TiltHeadLeft.gr2', 'ControlParameters|TiltHeadLeft', 0.0, 1.0, FACE_POSE_TILTHEAD_BONELIST)
    350     AddPose(animation, pose_res_list, 'res:\\Animation\\PortraitCreator\\Female\\Common\\Util_TiltHeadRight.gr2', 'ControlParameters|TiltHeadRight', 0.0, 1.0, FACE_POSE_TILTHEAD_BONELIST)
    351     return pose_res_list
    352 
    353 
    354 def PlaySecondaryPoseAnimations(animation, pose_res_list):
    355     for pose_res_path, pose_layer_name, default_value, default_weight, bone_list in pose_res_list:
    356         pose_anim_name = animation.GetSecondaryAnimationName(pose_res_path, 0)
    357         animation.AddAnimationLayer(pose_layer_name, default_weight)
    358         if not bone_list:
    359             animation.AddAnimationLayerAllBones(pose_layer_name)
    360             animation.RemoveAnimationLayerBone(pose_layer_name, 'Plane')
    361         else:
    362             for bone_name in bone_list:
    363                 animation.AddAnimationLayerBone(pose_layer_name, bone_name)
    364 
    365         if default_value is None:
    366             animation.PlayLayerAnimation(pose_layer_name, pose_anim_name, True, 0, 0, 1.0, False)
    367         else:
    368             animation.SetLayerControlParam(pose_layer_name, default_value)
    369             animation.PlayLayerAnimation(pose_layer_name, pose_anim_name, True, 0, 0, 0.0, False)
    370 
    371 
    372 def OneLayerParamHandler(value, animparams, param):
    373     while animparams.rebuilding:
    374         blue.synchro.Yield()
    375 
    376     animparams.avatar.animationUpdater.SetLayerControlParam(param, clamp(value, 0.99, 0.0))
    377 
    378 
    379 def BaseParamHandler(value, animparams):
    380     while animparams.rebuilding:
    381         blue.synchro.Yield()
    382 
    383     animparams.avatar.animationUpdater.SetLayerControlParam('', clamp(value, 0.99, 0.0))
    384 
    385 
    386 def TwoLayerParamHandler(value, animparams, lowParam, highParam):
    387     while animparams.rebuilding:
    388         blue.synchro.Yield()
    389 
    390     if value < 0.5:
    391         scaled_val = clamp(1 - value * 2, 0.99, 0.0)
    392         animparams.avatar.animationUpdater.SetLayerControlParam(lowParam, scaled_val)
    393         animparams.avatar.animationUpdater.SetLayerControlParam(highParam, 0.0)
    394     else:
    395         scaled_val = clamp(value * 2 - 1, 0.99, 0.0)
    396         animparams.avatar.animationUpdater.SetLayerControlParam(lowParam, 0.0)
    397         animparams.avatar.animationUpdater.SetLayerControlParam(highParam, scaled_val)
    398 
    399 
    400 def SetGstateParameter(name, value, animparams):
    401     for parameter in animparams.avatar.animationUpdater.parameters:
    402         if parameter.name == name and parameter.nodename == 'Controls':
    403             parameter.value = value
    404 
    405 
    406 def HeadLookUpDownHandler(value, animparams):
    407     while animparams.rebuilding:
    408         blue.synchro.Yield()
    409 
    410     network_mode = animparams.GetControlParameter('ControlParameters|NetworkMode')
    411     if network_mode == NETWORKMODE_PORTRAIT:
    412         return
    413     if type(animparams.avatar.animationUpdater) == trinity.Tr2GStateAnimation:
    414         SetGstateParameter('HeadPitch', value, animparams)
    415 
    416 
    417 def HeadLookLeftRightHandler(value, animparams):
    418     while animparams.rebuilding:
    419         blue.synchro.Yield()
    420 
    421     network_mode = animparams.GetControlParameter('ControlParameters|NetworkMode')
    422     if network_mode == NETWORKMODE_PORTRAIT:
    423         return
    424     if type(animparams.avatar.animationUpdater) == trinity.Tr2GStateAnimation:
    425         SetGstateParameter('HeadYaw', value, animparams)
    426 
    427 
    428 def CameraDistanceHandler(value, animparams):
    429     while animparams.rebuilding:
    430         blue.synchro.Yield()
    431 
    432     network_mode = animparams.GetControlParameter('ControlParameters|NetworkMode')
    433     if network_mode == NETWORKMODE_PORTRAIT:
    434         return
    435     if type(animparams.avatar.animationUpdater) == trinity.Tr2GStateAnimation:
    436         SetGstateParameter('CloseupToggle', value, animparams)
    437 
    438 
    439 def HeadLookTargetHandler(value, animparams):
    440     while animparams.rebuilding:
    441         blue.synchro.Yield()
    442 
    443     if type(value) is tuple:
    444         animparams.avatar.animationUpdater.AimBone('Head', value[0], value[1], value[2], 0.0, 0.0, 1.0)
    445 
    446 
    447 def IsAliveHandler(value, animparams):
    448     while animparams.rebuilding:
    449         blue.synchro.Yield()
    450 
    451     if value:
    452         animparams.avatar.animationUpdater.SetLayerWeight('idle', 1.0)
    453     else:
    454         animparams.avatar.animationUpdater.SetLayerWeight('idle', 0.0)
    455 
    456 
    457 def CreateGrannyBoneOffsets(animparams):
    458     if animparams.doll:
    459         animparams.factory.CreateAnimationOffsets(animparams.avatar, animparams.doll)
    460         return
    461     if animparams.characterSvc:
    462         for character in animparams.characterSvc.characters:
    463             default_factory = sm.GetService('paperDollClient').dollFactory
    464             av = animparams.characterSvc.characters[character].avatar
    465             fac = getattr(animparams.characterSvc.characters[character], 'factory', default_factory)
    466             doll = animparams.characterSvc.characters[character].doll
    467             if av is animparams.avatar:
    468                 fac.CreateAnimationOffsets(av, doll)
    469 
    470 
    471 def clamp(value, max_value, min_value):
    472     return max(min(value, max_value), min_value)