예제 #1
0
 /// <summary>
 /// Forcibly fix the limb in place. Release the limb if it's currently fixed.
 /// </summary>
 /// <param name="limb">The limb to toggle</param>
 /// <param name="buttonText">Text object of the button to change</param>
 /// <param name="turnOffText">Button text to display when limb is currently fixed</param>
 /// <param name="turnOnText">Button text to display when limb is currently not fixed</param>
 private void PushLimbButton(LimbName limb, Text buttonText = null, string turnOffText = null, string turnOnText = null)
 {
     if (!limbs[(int)limb].AnchorObj)
     {
         FixLimbToggle(limbs[(int)limb], true);
         if (buttonText)
         {
             buttonText.text = turnOffText;
         }
     }
     else if (!limbs[(int)limb].Fixed)
     {
         limbs[(int)limb].Fixed = true;
         if (buttonText)
         {
             buttonText.text = turnOffText;
         }
     }
     else
     {
         FixLimbToggle(limbs[(int)limb]);
         if (buttonText)
         {
             buttonText.text = turnOnText;
         }
     }
 }
예제 #2
0
        private void SetLimbColliders(LimbName limb)
        {
            GameObject collider = new GameObject(limbs[(int)limb].LimbPart.ToString() + "Collider");

            collider.AddComponent <FixBodyParts>().Init(this, limbs[(int)limb].LimbPart);
            collider.transform.parent        = limbs[(int)limb].Effector.bone;
            collider.transform.localPosition = Vector3.zero;
        }
예제 #3
0
            internal Limb(LimbName limbpart, GameObject anchorObj, Transform animPos, IKEffector effector, Transform origTarget,
                          BaseData targetBone, FBIKChain chain = null, BaseData parentJointBone = null, IKEffector parentJointEffector = null,
                          Transform parentJointAnimPos         = null, bool fix = false)
            {
                LimbPart   = limbpart;
                AnchorObj  = anchorObj;
                AnimPos    = animPos;
                Effector   = effector;
                Chain      = chain;
                OrigTarget = origTarget;
                TargetBone = targetBone;
                Fixed      = fix;

                ParentJointBone     = parentJointBone;
                ParentJointEffector = parentJointEffector;
                ParentJointAnimPos  = parentJointAnimPos;
            }
예제 #4
0
        /// <summary>
        /// Diable SetParent functionality
        /// </summary>
        public void UnsetP()
        {
            UnityEngine.Object.Destroy(maleHeadPos);
            UnityEngine.Object.Destroy(maleCrotchPos);
            femaleSpinePos.transform.parent = null;

            PushLimbAutoAttachButton(true);

            foreach (KeyValuePair <Side, GameObject> pair in controllers)
            {
                pair.Value.transform.Find("Model").gameObject.SetActive(true);
            }

            if (SetControllerCollider.Value)
            {
                foreach (KeyValuePair <Side, GameObject> pair in controllers)
                {
                    pair.Value.transform.Find("ControllerCollider").GetComponent <SphereCollider>().enabled = true;
                }
            }

            if (obj_chaF_001.GetComponent <AnimSpeedController>() != null)
            {
                UnityEngine.Object.Destroy(obj_chaF_001.GetComponent <AnimSpeedController>());
            }

            foreach (Side side in Enum.GetValues(typeof(Side)))
            {
                SyncMaleHandsToggle(enable: false, side);
            }

            for (LimbName i = LimbName.MaleLeftHand; i <= LimbName.MaleRightHand; i++)
            {
                limbs[(int)i].ParentJointBone.bone = null;
                limbs[(int)i].ParentJointEffector.positionWeight = 0f;
            }

            male_hips_bd.bone = null;
            maleFBBIK.solver.bodyEffector.positionWeight = 0f;

            txtSetParentL.text = "左 親子付け Turn On";
            txtSetParentR.text = "右 親子付け Turn On";

            setFlag = false;
        }
예제 #5
0
 public void Init(SetParent sp, LimbName p)
 {
     setParentObj = sp;
     limbName     = p;
 }
예제 #6
0
        /// <summary>
        /// Initialize or disable male hands from anchoring to the controllers, depends on the passed parameter
        /// </summary>
        /// <param name="enable">To enable or disable the functionality</param>
        internal void SyncMaleHandsToggle(bool enable, Side side)
        {
            if (hFlag.mode <= HFlag.EMode.aibu || (hFlag.mode >= HFlag.EMode.masturbation && hFlag.mode <= HFlag.EMode.lesbian))
            {
                return;
            }

            LimbName limb = side == Side.Left ? LimbName.MaleLeftHand : LimbName.MaleRightHand;

            if (enable)
            {
                if (!limbs[(int)limb].AnchorObj)
                {
                    FixLimbToggle(limbs[(int)limb]);
                }

                limbs[(int)limb].AnchorObj.transform.parent = controllers[side].transform;

                //Reposition anchor to align the male hand model to the controller
                limbs[(int)limb].AnchorObj.transform.localPosition = new Vector3(0, 0, -0.1f);
                limbs[(int)limb].AnchorObj.transform.localRotation = Quaternion.Euler(-90f, side == Side.Left ? 90f : -90f, 0f) * Quaternion.Euler(0, side == Side.Left ? -30f : 30f, 0f);

                //Hide controller hand model
                foreach (SkinnedMeshRenderer mesh in controllers[side].transform.GetComponentsInChildren <SkinnedMeshRenderer>(true))
                {
                    mesh.enabled = false;
                }

                //Restore male shoulder parameters to default as shoulder fixing will be disabled when hands are anchored to the controllers
                limbs[(int)limb].ParentJointBone.bone = null;
                limbs[(int)limb].ParentJointEffector.positionWeight = 0f;

                //Enable collider for the hand that is being synced, no reason to hide it as it is now visible
                if (SetControllerCollider.Value)
                {
                    controllers[side].transform.Find("ControllerCollider").GetComponent <SphereCollider>().enabled = true;
                }
            }
            else
            {
                if (limbs[(int)limb].AnchorObj)
                {
                    FixLimbToggle(limbs[(int)limb]);
                }

                if (GropeHandsDisplay.Value < HideHandMode.AlwaysShow)
                {
                    itemHands[(int)limb - 4].enabled = true;
                }

                foreach (SkinnedMeshRenderer mesh in controllers[side].transform.GetComponentsInChildren <SkinnedMeshRenderer>(true))
                {
                    mesh.enabled = true;
                }

                //Disable the collider if the controller model is currently hidden
                if (SetControllerCollider.Value && controllers[side].transform.Find("Model").gameObject.activeSelf == false)
                {
                    controllers[side].transform.Find("ControllerCollider").GetComponent <SphereCollider>().enabled = false;
                }
            }
        }
예제 #7
0
        public void Start()
        {
            if (hSprite == null)
            {
                if (!(hSprite = GameObject.Find("VRTK/[VRTK_SDKManager]/SDKSetups/SteamVR/VRCameraBase/[CameraRig]/Controller (left)/Model/p_handL/HSceneMainCanvas/MainCanvas").GetComponent <HSprite>()))
                {
                    BepInEx.Logger.Log(BepInEx.Logging.LogLevel.Error, "HSprite not found. SetParent will exit");
                    Destroy(this);
                }
            }
            femaleExists = false;
            hideCanvas   = MenuHideDefault.Value;

            hFlag     = hSprite.flags;
            f_device  = typeof(VRViveController).GetField("device", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
            cameraEye = hSprite.managerVR.objCamera;
            controllers[Side.Left]  = hSprite.managerVR.objMove.transform.Find("Controller (left)").gameObject;
            controllers[Side.Right] = hSprite.managerVR.objMove.transform.Find("Controller (right)").gameObject;
            foreach (Side side in Enum.GetValues(typeof(Side)))
            {
                viveControllers[side] = controllers[side].GetComponent <VRViveController>();
                steamVRDevices[side]  = f_device.GetValue(viveControllers[side]) as SteamVR_Controller.Device;
            }

            itemHands[0] = Traverse.Create(controllers[Side.Left].transform.Find("Model/p_handL").GetComponent <VRHandCtrl>()).Field("dicItem").GetValue <Dictionary <int, VRHandCtrl.AibuItem> >()[0].objBody.GetComponent <SkinnedMeshRenderer>();
            itemHands[1] = Traverse.Create(controllers[Side.Right].transform.Find("Model/p_handR").GetComponent <VRHandCtrl>()).Field("dicItem").GetValue <Dictionary <int, VRHandCtrl.AibuItem> >()[0].objBody.GetComponent <SkinnedMeshRenderer>();

            male                 = (ChaControl)Traverse.Create(hSprite).Field("male").GetValue();
            female               = ((List <ChaControl>)Traverse.Create(hSprite).Field("females").GetValue())[0];
            obj_chaF_001         = female.objRoot;
            male_p_cf_bodybone   = male.objAnim;
            female_p_cf_bodybone = female.objAnim;
            maleFBBIK            = male_p_cf_bodybone.GetComponent <FullBodyBipedIK>();
            femaleFBBIK          = female_p_cf_bodybone.GetComponent <FullBodyBipedIK>();
            femaleAim            = femaleFBBIK.references.head.Find("cf_s_head/aim").gameObject;

            female_cf_j_root    = femaleFBBIK.references.root.gameObject;
            female_cf_j_hips    = femaleFBBIK.references.pelvis.gameObject;
            female_cf_n_height  = femaleFBBIK.references.pelvis.parent.gameObject;
            female_cf_j_spine01 = femaleFBBIK.references.spine[0].gameObject;
            female_cf_j_spine02 = femaleFBBIK.references.spine[1].gameObject;
            female_cf_j_neck    = femaleFBBIK.references.spine[2].gameObject;
            female_cf_j_spine03 = femaleFBBIK.references.spine[2].parent.gameObject;

            switch (ParentPart.Value)
            {
            case BodyPart.Ass:
                femaleBase = female_cf_j_hips;
                break;

            case BodyPart.Torso:
                femaleBase = female_cf_j_spine02;
                break;

            case BodyPart.Head:
                femaleBase = female_cf_j_neck;
                break;

            default:
                femaleBase = female_cf_j_spine02;
                break;
            }
            femaleSpinePos = new GameObject("femaleSpinePos");

            Transform female_cf_pv_hand_R = female_cf_n_height.transform.Find("cf_pv_root/cf_pv_hand_R");
            Transform female_cf_pv_hand_L = female_cf_n_height.transform.Find("cf_pv_root/cf_pv_hand_L");
            Transform female_cf_pv_leg_R  = female_cf_n_height.transform.Find("cf_pv_root/cf_pv_leg_R");
            Transform female_cf_pv_leg_L  = female_cf_n_height.transform.Find("cf_pv_root/cf_pv_leg_L");
            BaseData  female_hand_L_bd    = femaleFBBIK.solver.leftHandEffector.target.GetComponent <BaseData>();
            BaseData  female_hand_R_bd    = femaleFBBIK.solver.rightHandEffector.target.GetComponent <BaseData>();
            BaseData  female_leg_L_bd     = femaleFBBIK.solver.leftFootEffector.target.GetComponent <BaseData>();
            BaseData  female_leg_R_bd     = femaleFBBIK.solver.rightFootEffector.target.GetComponent <BaseData>();

            Transform male_cf_n_height  = maleFBBIK.references.pelvis.parent;
            Transform male_cf_pv_hand_R = male_cf_n_height.Find("cf_pv_root/cf_pv_hand_R");
            Transform male_cf_pv_hand_L = male_cf_n_height.Find("cf_pv_root/cf_pv_hand_L");
            Transform male_cf_pv_leg_R  = male_cf_n_height.Find("cf_pv_root/cf_pv_leg_R");
            Transform male_cf_pv_leg_L  = male_cf_n_height.Find("cf_pv_root/cf_pv_leg_L");

            male_cf_pv_hips = male_cf_n_height.Find("cf_pv_root/cf_pv_hips");
            male_hips_bd    = maleFBBIK.solver.bodyEffector.target.GetComponent <BaseData>();

            BaseData male_hand_L_bd = maleFBBIK.solver.leftHandEffector.target.GetComponent <BaseData>();
            BaseData male_hand_R_bd = maleFBBIK.solver.rightHandEffector.target.GetComponent <BaseData>();
            BaseData male_leg_L_bd  = maleFBBIK.solver.leftFootEffector.target.GetComponent <BaseData>();
            BaseData male_leg_R_bd  = maleFBBIK.solver.rightFootEffector.target.GetComponent <BaseData>();

            limbs[(int)LimbName.FemaleLeftHand] = new Limb(
                limbpart: LimbName.FemaleLeftHand,
                anchorObj: null,
                animPos: female_cf_pv_hand_L,
                effector: femaleFBBIK.solver.leftHandEffector,
                origTarget: femaleFBBIK.solver.leftHandEffector.target,
                targetBone: female_hand_L_bd,
                chain: femaleFBBIK.solver.leftArmChain);

            limbs[(int)LimbName.FemaleRightHand] = new Limb(
                limbpart: LimbName.FemaleRightHand,
                anchorObj: null,
                animPos: female_cf_pv_hand_R,
                effector: femaleFBBIK.solver.rightHandEffector,
                origTarget: femaleFBBIK.solver.rightHandEffector.target,
                targetBone: female_hand_R_bd,
                chain: femaleFBBIK.solver.rightArmChain);

            limbs[(int)LimbName.FemaleLeftFoot] = new Limb(
                limbpart: LimbName.FemaleLeftFoot,
                anchorObj: null,
                animPos: female_cf_pv_leg_L,
                effector: femaleFBBIK.solver.leftFootEffector,
                origTarget: femaleFBBIK.solver.leftFootEffector.target,
                targetBone: female_leg_L_bd,
                chain: femaleFBBIK.solver.leftLegChain);

            limbs[(int)LimbName.FemaleRightFoot] = new Limb(
                limbpart: LimbName.FemaleRightFoot,
                anchorObj: null,
                animPos: female_cf_pv_leg_R,
                effector: femaleFBBIK.solver.rightFootEffector,
                origTarget: femaleFBBIK.solver.rightFootEffector.target,
                targetBone: female_leg_R_bd,
                chain: femaleFBBIK.solver.rightLegChain);

            limbs[(int)LimbName.MaleLeftHand] = new Limb(
                limbpart: LimbName.MaleLeftHand,
                anchorObj: null,
                animPos: male_cf_pv_hand_L,
                effector: maleFBBIK.solver.leftHandEffector,
                origTarget: maleFBBIK.solver.leftHandEffector.target,
                targetBone: male_hand_L_bd,
                chain: maleFBBIK.solver.leftArmChain,
                parentJointBone: maleFBBIK.solver.leftShoulderEffector.target.GetComponent <BaseData>(),
                parentJointEffector: maleFBBIK.solver.leftShoulderEffector,
                parentJointAnimPos: male_cf_n_height.Find("cf_pv_root/cf_pv_hips/cf_ik_hips/cf_kk_shoulder/cf_pv_shoulder_L"));

            limbs[(int)LimbName.MaleRightHand] = new Limb(
                limbpart: LimbName.MaleRightHand,
                anchorObj: null,
                animPos: male_cf_pv_hand_R,
                effector: maleFBBIK.solver.rightHandEffector,
                origTarget: maleFBBIK.solver.rightHandEffector.target,
                targetBone: male_hand_R_bd,
                chain: maleFBBIK.solver.rightArmChain,
                parentJointBone: maleFBBIK.solver.rightShoulderEffector.target.GetComponent <BaseData>(),
                parentJointEffector: maleFBBIK.solver.rightShoulderEffector,
                parentJointAnimPos: male_cf_n_height.Find("cf_pv_root/cf_pv_hips/cf_ik_hips/cf_kk_shoulder/cf_pv_shoulder_R"));

            limbs[(int)LimbName.MaleLeftFoot] = new Limb(
                limbpart: LimbName.MaleLeftFoot,
                anchorObj: null,
                animPos: male_cf_pv_leg_L,
                effector: maleFBBIK.solver.leftFootEffector,
                origTarget: maleFBBIK.solver.leftFootEffector.target,
                targetBone: male_leg_L_bd);

            limbs[(int)LimbName.MaleRightFoot] = new Limb(
                limbpart: LimbName.MaleRightFoot,
                anchorObj: null,
                animPos: male_cf_pv_leg_R,
                effector: maleFBBIK.solver.rightFootEffector,
                origTarget: maleFBBIK.solver.rightFootEffector.target,
                targetBone: male_leg_R_bd);


            SetShoulderColliders();

            foreach (Transform transform in GameObject.Find("Map").GetComponentsInChildren <Transform>())
            {
                SetObjectColliders(transform);
            }

            if (SetControllerCollider.Value)
            {
                foreach (KeyValuePair <Side, GameObject> pair in controllers)
                {
                    SetControllerColliders(pair.Value);
                }
            }

            for (LimbName i = LimbName.FemaleLeftHand; i <= LimbName.FemaleRightFoot; i++)
            {
                SetLimbColliders(i);
            }

            if (SetMaleFeetCollider.Value)
            {
                for (LimbName i = LimbName.MaleLeftFoot; i <= LimbName.MaleRightFoot; i++)
                {
                    SetLimbColliders(i);
                }
            }
        }