Esempio n. 1
0
        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;
        }
Esempio n. 2
0
        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;
        }