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)