private static void AddTwistRelaxer(Transform forearm, VRIK_New ik, Transform hand) { if (forearm == null) { return; } var twistRelaxer = forearm.gameObject.AddComponent <TwistRelaxer_New>(); twistRelaxer.ik = ik; twistRelaxer.weight = 0.5f; twistRelaxer.child = hand; twistRelaxer.parentChildCrossfade = 0.8f; }
internal static void PreSetupVrIk(GameObject targetGameObject) { var vrik = targetGameObject.GetComponent <VRIK_New>(); if (vrik is null) { vrik = targetGameObject.AddComponent <VRIK_New>(); var animator = targetGameObject.GetComponent <Animator>(); var handler = new HumanPoseHandler(animator.avatar, animator.transform); var hips = animator.GetBoneTransform(HumanBodyBones.Hips); var muscles = new Il2CppStructArray <float>(HumanTrait.MuscleCount); vrik.solver.OnPreUpdate += () => { if (vrik.solver.IKPositionWeight < 0.9f) { return; } var hipPos = hips.position; var hipRot = hips.rotation; handler.GetHumanPose(out var bodyPos, out var bodyRot, muscles); for (var i = 0; i < muscles.Count; i++) { if (IkTweaksSettings.IgnoreAnimations && IKTweaksMod.ourRandomPuck.activeInHierarchy) { muscles[i] *= ourBoneResetMasks[i] == BoneResetMask.Never ? 1 : 0; continue; } switch (ourBoneResetMasks[i]) { case BoneResetMask.Never: break; case BoneResetMask.Spine: muscles[i] *= 1 - vrik.solver.spine.pelvisPositionWeight; break; case BoneResetMask.LeftArm: muscles[i] *= 1 - vrik.solver.leftArm.positionWeight; break; case BoneResetMask.RightArm: muscles[i] *= 1 - vrik.solver.rightArm.positionWeight; break; case BoneResetMask.LeftLeg: muscles[i] *= 1 - vrik.solver.leftLeg.positionWeight; break; case BoneResetMask.RightLeg: muscles[i] *= 1 - vrik.solver.rightLeg.positionWeight; break; default: throw new ArgumentOutOfRangeException(); } } handler.SetHumanPose(ref bodyPos, ref bodyRot, muscles); hips.position = hipPos; hips.rotation = hipRot; }; vrik.solver.OnPostUpdate += () => { if (!IkTweaksSettings.AddHumanoidPass) { return; } var hipPos = hips.position; var hipRot = hips.rotation; handler.GetHumanPose(out var bodyPos, out var bodyRot, muscles); handler.SetHumanPose(ref bodyPos, ref bodyRot, muscles); hips.position = hipPos; hips.rotation = hipRot; }; } LastInitializedVRIK = vrik; vrik.enabled = false; }