using System; using System.Collections.Generic; using UnityEngine; public class WristTwist : ATwistCtrl { public WristTwist(bool is_left, TBody body) : base((!is_left) ? Maid.AutoTwist.WristR : Maid.AutoTwist.WristL, body) { string str; if (body.IsCrcBody) { str = "Bip01"; } else { str = (body.boMAN ? "ManBip" : "Bip01"); } string str2 = (!is_left) ? " R Hand" : " L Hand"; base.bone = body.GetBone(str + str2); base.mrBone = base.GetMRBone(str + str2); if (body.IsCrcBody) { for (int i = 0; i < 6; i++) { string name = (!is_left) ? string.Format("ForeTwist{0}_R", i + 1) : string.Format("ForeTwist{0}_L", i + 1); Transform transform = base.bone.parent.Find(name); if (transform) { Transform transform2 = base.mrBone.parent.Find(name); if (transform2) { base.twistBones.Add(new KeyValuePair(transform2, transform)); } } } } } public override void ApplyTwist() { Vector3 vector = base.bone.rotation * Vector3.forward; Vector3 vector2 = base.bone.parent.rotation * base.mrBone.localRotation * Vector3.forward; Vector3 normalized = (base.bone.position - base.bone.parent.position).normalized; vector2 = (vector2 - normalized * Vector3.Dot(vector2, normalized)).normalized; vector = (vector - normalized * Vector3.Dot(vector, normalized)).normalized; float f = Vector3.Dot(vector2, vector); float num = Mathf.Acos(f) * 57.29578f; if (float.IsNaN(num)) { num = 0f; } else { Vector3 lhs = Vector3.Cross(normalized, vector2); if (Vector3.Dot(lhs, vector) < 0f) { num = -num; } } for (int i = 0; i < base.twistBones.Count; i++) { KeyValuePair keyValuePair = base.twistBones[i]; float num2 = (float)i / (float)(base.twistBones.Count - 1); keyValuePair.Value.localRotation = keyValuePair.Key.localRotation; keyValuePair.Value.rotation = Quaternion.AngleAxis(num * num2, normalized) * keyValuePair.Value.rotation; } } }