/// <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; } } }
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; }
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; }
/// <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; }
public void Init(SetParent sp, LimbName p) { setParentObj = sp; limbName = p; }
/// <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; } } }
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); } } }