using System; using UnityEngine; using System.Linq; using System.Collections.Generic; namespace ky1001 { public class MoveControlsToBody : MVRScript { #region PluginInfo public string pluginAuthor = "ky1001"; public string pluginName = "MoveControlsToBody"; public string pluginVersion = "6.0"; public string pluginDate = "2025-03-22"; public string pluginDescription = ""; #endregion // Controls protected Atom CurrentAtom; private FreeControllerV3 _controlControl; private FreeControllerV3 _headControl; private FreeControllerV3 _chestControl; private FreeControllerV3 _hipControl; private FreeControllerV3 _rHandControl; private FreeControllerV3 _lHandControl; private FreeControllerV3 _rFootControl; private FreeControllerV3 _lFootControl; private FreeControllerV3 _rElbowControl; private FreeControllerV3 _lElbowControl; private FreeControllerV3 _rKneeControl; private FreeControllerV3 _lKneeControl; private FreeControllerV3 _neckControl; private FreeControllerV3 _rArmControl; private FreeControllerV3 _lArmControl; private FreeControllerV3 _pelvisControl; private FreeControllerV3 _abdomenControl; private FreeControllerV3 _abdomen2Control; private FreeControllerV3 _rThighControl; private FreeControllerV3 _lThighControl; private FreeControllerV3 _rToeControl; private FreeControllerV3 _lToeControl; private FreeControllerV3 _rShoulderControl; private FreeControllerV3 _lShoulderControl; // Bodies private Rigidbody _head; private Rigidbody _chest; private Rigidbody _hip; private Rigidbody _rHand; private Rigidbody _lHand; private Rigidbody _rFoot; private Rigidbody _lFoot; private Rigidbody _rElbow; private Rigidbody _lElbow; private Rigidbody _rKnee; private Rigidbody _lKnee; private Rigidbody _neck; private Rigidbody _rArm; private Rigidbody _lArm; private Rigidbody _pelvis; private Rigidbody _abdomen; private Rigidbody _abdomen2; private Rigidbody _rThigh; private Rigidbody _lThigh; private Rigidbody _rToe; private Rigidbody _lToe; private Rigidbody _rCollar; private Rigidbody _lCollar; protected UIDynamicButton button; protected JSONStorableFloat slider1; protected JSONStorableFloat slider2; protected JSONStorableBool toggle; protected JSONStorableBool toggle2; protected JSONStorableFloat slider3; protected JSONStorableBool toggle3; protected JSONStorableStringChooser atomJSON; protected UIDynamicPopup dp; private UIDynamicButton rfl_button; public override void Init() { try { //SuperController.LogMessage($"{nameof(MoveControlsToBody_V3)} initialized"); #region Button atomJSON = new JSONStorableStringChooser("Target", null, "None", "Target"); RegisterStringChooser(atomJSON); dp = CreateScrollablePopup(atomJSON, false); dp.popupPanelHeight = 650f; dp.popup.selectColor = new Color(0.8f, 0.8f, 0.8f); mkList(); var spacer = CreateSpacer(true); spacer.height = 30f; rfl_button = CreateButton("Refresh List", true); if (rfl_button != null) { rfl_button.button.onClick.AddListener(mkList); } JSONStorableAction refreshListAct = new JSONStorableAction("Refresh List", () => { mkList(); }); RegisterAction(refreshListAct); spacer = CreateSpacer(true); spacer.height = 100f; spacer = CreateSpacer(false); spacer.height = 30f; button = CreateButton("Move Controls to Body"); if (button != null) { button.button.onClick.AddListener(() => { MoveControls(); }); } JSONStorableAction MoveControlsBody = new JSONStorableAction("Button Move Controls to Body", () => { MoveControls(); }); RegisterAction(MoveControlsBody); toggle = new JSONStorableBool("Move bottom Control to Atom control", false); CreateToggle(toggle, true); RegisterBool(toggle); slider1 = new JSONStorableFloat("Correction Value for Static", 0.02f, -0.1f, 0.1f, true); slider1.val = 0f; RegisterFloat(slider1); slider2 = new JSONStorableFloat("Distance between bottom Control and Atom control", 0.05f, -0.2f, 0.2f, true); CreateSlider(slider2, true); RegisterFloat(slider2); toggle2 = new JSONStorableBool("Use Threshold", true); CreateToggle(toggle2); RegisterBool(toggle2); slider3 = new JSONStorableFloat("Adjust Threshold Value", 0.04f, 0.0f, 0.5f, true); CreateSlider(slider3); RegisterFloat(slider3); toggle3 = new JSONStorableBool("Move Atom control to Ground", false); CreateToggle(toggle3, true); RegisterBool(toggle3); #endregion SuperController.singleton.BroadcastMessage("OnActionsProviderAvailable", this, SendMessageOptions.DontRequireReceiver); } catch (Exception e) { SuperController.LogError($"{nameof(MoveControlsToBody)}.{nameof(Init)}: {e}"); } } public void mkList() { List targetChoices = new List(); foreach (string atomUID in SuperController.singleton.GetAtomUIDs()) { var targetAtom = SuperController.singleton.GetAtomByUid(atomUID); if (targetAtom.type == "Person") { targetChoices.Add(atomUID); } } atomJSON.choices = targetChoices; if (containingAtom.type == "Person") { atomJSON.val = containingAtom.name; } else { atomJSON.val = "None"; } } public void MoveControls() { if (atomJSON.val != "None") { CurrentAtom = SuperController.singleton.GetAtomByUid(atomJSON.val); _controlControl = CurrentAtom.freeControllers.First(fc => fc.name == "control"); _headControl = CurrentAtom.freeControllers.First(fc => fc.name == "headControl"); _chestControl = CurrentAtom.freeControllers.First(fc => fc.name == "chestControl"); _hipControl = CurrentAtom.freeControllers.First(fc => fc.name == "hipControl"); _rHandControl = CurrentAtom.freeControllers.First(fc => fc.name == "rHandControl"); _lHandControl = CurrentAtom.freeControllers.First(fc => fc.name == "lHandControl"); _rFootControl = CurrentAtom.freeControllers.First(fc => fc.name == "rFootControl"); _lFootControl = CurrentAtom.freeControllers.First(fc => fc.name == "lFootControl"); _rElbowControl = CurrentAtom.freeControllers.First(fc => fc.name == "rElbowControl"); _lElbowControl = CurrentAtom.freeControllers.First(fc => fc.name == "lElbowControl"); _rKneeControl = CurrentAtom.freeControllers.First(fc => fc.name == "rKneeControl"); _lKneeControl = CurrentAtom.freeControllers.First(fc => fc.name == "lKneeControl"); _neckControl = CurrentAtom.freeControllers.First(fc => fc.name == "neckControl"); _rArmControl = CurrentAtom.freeControllers.First(fc => fc.name == "rArmControl"); _lArmControl = CurrentAtom.freeControllers.First(fc => fc.name == "lArmControl"); _pelvisControl = CurrentAtom.freeControllers.First(fc => fc.name == "pelvisControl"); _abdomenControl = CurrentAtom.freeControllers.First(fc => fc.name == "abdomenControl"); _abdomen2Control = CurrentAtom.freeControllers.First(fc => fc.name == "abdomen2Control"); _rThighControl = CurrentAtom.freeControllers.First(fc => fc.name == "rThighControl"); _lThighControl = CurrentAtom.freeControllers.First(fc => fc.name == "lThighControl"); _rToeControl = CurrentAtom.freeControllers.First(fc => fc.name == "rToeControl"); _lToeControl = CurrentAtom.freeControllers.First(fc => fc.name == "lToeControl"); _rShoulderControl = CurrentAtom.freeControllers.First(fc => fc.name == "rShoulderControl"); _lShoulderControl = CurrentAtom.freeControllers.First(fc => fc.name == "lShoulderControl"); //_control = CurrentAtom.rigidbodies.First(rb => rb.name == "control"); _head = CurrentAtom.rigidbodies.First(rb => rb.name == "head"); _chest = CurrentAtom.rigidbodies.First(rb => rb.name == "chest"); _hip = CurrentAtom.rigidbodies.First(rb => rb.name == "hip"); _rHand = CurrentAtom.rigidbodies.First(rb => rb.name == "rHand"); _lHand = CurrentAtom.rigidbodies.First(rb => rb.name == "lHand"); _rFoot = CurrentAtom.rigidbodies.First(rb => rb.name == "rFoot"); _lFoot = CurrentAtom.rigidbodies.First(rb => rb.name == "lFoot"); _rElbow = CurrentAtom.rigidbodies.First(rb => rb.name == "rForeArm"); _lElbow = CurrentAtom.rigidbodies.First(rb => rb.name == "lForeArm"); _rKnee = CurrentAtom.rigidbodies.First(rb => rb.name == "rShin"); _lKnee = CurrentAtom.rigidbodies.First(rb => rb.name == "lShin"); _neck = CurrentAtom.rigidbodies.First(rb => rb.name == "neck"); _rArm = CurrentAtom.rigidbodies.First(rb => rb.name == "rShldr"); _lArm = CurrentAtom.rigidbodies.First(rb => rb.name == "lShldr"); _pelvis = CurrentAtom.rigidbodies.First(rb => rb.name == "pelvis"); _abdomen = CurrentAtom.rigidbodies.First(rb => rb.name == "abdomen"); _abdomen2 = CurrentAtom.rigidbodies.First(rb => rb.name == "abdomen2"); _rThigh = CurrentAtom.rigidbodies.First(rb => rb.name == "rThigh"); _lThigh = CurrentAtom.rigidbodies.First(rb => rb.name == "lThigh"); _rToe = CurrentAtom.rigidbodies.First(rb => rb.name == "rToe"); _lToe = CurrentAtom.rigidbodies.First(rb => rb.name == "lToe"); _rCollar = CurrentAtom.rigidbodies.First(rb => rb.name == "rCollar"); _lCollar = CurrentAtom.rigidbodies.First(rb => rb.name == "lCollar"); float _headp = _head.transform.position.y; float _chestp = _chest.transform.position.y; float _hipp = _hip.transform.position.y; float _rHandp = _rHand.transform.position.y; float _lHandp = _lHand.transform.position.y; float _rFootp = _rFoot.transform.position.y; float _lFootp = _lFoot.transform.position.y; float _rElbowp = _rElbow.transform.position.y; float _lElbowp = _lElbow.transform.position.y; float _rKneep = _rKnee.transform.position.y; float _lKneep = _lKnee.transform.position.y; float _neckp = _neck.transform.position.y; float _rArmp = _rArm.transform.position.y; float _lArmp = _lArm.transform.position.y; float _pelvisp = _pelvis.transform.position.y; float _abdomenp = _abdomen.transform.position.y; float _abdomen2p = _abdomen2.transform.position.y; float _rThighp = _rThigh.transform.position.y; float _lThighp = _lThigh.transform.position.y; float _rToep = _rToe.transform.position.y; float _lToep = _lToe.transform.position.y; float sv; float _base = Mathf.Min(_headp, _chestp, _hipp, _rHandp, _lHandp, _rFootp, _lFootp, _rElbowp, _lElbowp, _rKneep, _lKneep, _neckp, _rArmp, _lArmp, _pelvisp, _abdomenp, _abdomen2p, _rThighp, _lThighp, _rToep, _lToep) - slider2.val; Vector3 _baseV = new Vector3(0f, _base, 0f); Vector3 _baseV2 = new Vector3(0f, slider1.val, 0f); Vector3 _vDistance; if (toggle2.val) { sv = slider3.val * slider3.val; } else { sv = 0f; } _vDistance = _headControl.transform.position - _head.transform.position; if (_vDistance.sqrMagnitude > sv) { _headControl.transform.position = _head.transform.position + _baseV2; } _vDistance = _chestControl.transform.position - _chest.transform.position; if (_vDistance.sqrMagnitude > sv) { _chestControl.transform.position = _chest.transform.position + _baseV2; } _vDistance = _hipControl.transform.position - _hip.transform.position; if (_vDistance.sqrMagnitude > sv) { _hipControl.transform.position = _hip.transform.position + _baseV2; } _vDistance = _rHandControl.transform.position - _rHand.transform.position; if (_vDistance.sqrMagnitude > sv) { _rHandControl.transform.position = _rHand.transform.position + _baseV2; } _vDistance = _lHandControl.transform.position - _lHand.transform.position; if (_vDistance.sqrMagnitude > sv) { _lHandControl.transform.position = _lHand.transform.position + _baseV2; } _vDistance = _rFootControl.transform.position - _rFoot.transform.position; if (_vDistance.sqrMagnitude > sv) { _rFootControl.transform.position = _rFoot.transform.position + _baseV2; } _vDistance = _lFootControl.transform.position - _lFoot.transform.position; if (_vDistance.sqrMagnitude > sv) { _lFootControl.transform.position = _lFoot.transform.position + _baseV2; } _vDistance = _rElbowControl.transform.position - _rElbow.transform.position; if (_vDistance.sqrMagnitude > sv) { _rElbowControl.transform.position = _rElbow.transform.position + _baseV2; } _vDistance = _lElbowControl.transform.position - _lElbow.transform.position; if (_vDistance.sqrMagnitude > sv) { _lElbowControl.transform.position = _lElbow.transform.position + _baseV2; } _vDistance = _rKneeControl.transform.position - _rKnee.transform.position; if (_vDistance.sqrMagnitude > sv) { _rKneeControl.transform.position = _rKnee.transform.position + _baseV2; } _vDistance = _lKneeControl.transform.position - _lKnee.transform.position; if (_vDistance.sqrMagnitude > sv) { _lKneeControl.transform.position = _lKnee.transform.position + _baseV2; } _vDistance = _neckControl.transform.position - _neck.transform.position; if (_vDistance.sqrMagnitude > sv) { _neckControl.transform.position = _neck.transform.position + _baseV2; } _vDistance = _rArmControl.transform.position - _rArm.transform.position; if (_vDistance.sqrMagnitude > sv) { _rArmControl.transform.position = _rArm.transform.position + _baseV2; } _vDistance = _lArmControl.transform.position - _lArm.transform.position; if (_vDistance.sqrMagnitude > sv) { _lArmControl.transform.position = _lArm.transform.position + _baseV2; } _vDistance = _pelvisControl.transform.position - _pelvis.transform.position; if (_vDistance.sqrMagnitude > sv) { _pelvisControl.transform.position = _pelvis.transform.position + _baseV2; } _vDistance = _abdomenControl.transform.position - _abdomen.transform.position; if (_vDistance.sqrMagnitude > sv) { _abdomenControl.transform.position = _abdomen.transform.position + _baseV2; } _vDistance = _abdomen2Control.transform.position - _abdomen2.transform.position; if (_vDistance.sqrMagnitude > sv) { _abdomen2Control.transform.position = _abdomen2.transform.position + _baseV2; } _vDistance = _rThighControl.transform.position - _rThigh.transform.position; if (_vDistance.sqrMagnitude > sv) { _rThighControl.transform.position = _rThigh.transform.position + _baseV2; } _vDistance = _lThighControl.transform.position - _lThigh.transform.position; if (_vDistance.sqrMagnitude > sv) { _lThighControl.transform.position = _lThigh.transform.position + _baseV2; } _vDistance = _rToeControl.transform.position - _rToe.transform.position; if (_vDistance.sqrMagnitude > sv) { _rToeControl.transform.position = _rToe.transform.position + _baseV2; } _vDistance = _lToeControl.transform.position - _lToe.transform.position; if (_vDistance.sqrMagnitude > sv) { _lToeControl.transform.position = _lToe.transform.position + _baseV2; } _vDistance = _rShoulderControl.transform.position - _rCollar.transform.position; if (_vDistance.sqrMagnitude > sv) { _rShoulderControl.transform.position = _rCollar.transform.position + _baseV2; } _vDistance = _lShoulderControl.transform.position - _lCollar.transform.position; if (_vDistance.sqrMagnitude > sv) { _lShoulderControl.transform.position = _lCollar.transform.position + _baseV2; } Vector3 _controlPosition = new Vector3(0f, _controlControl.transform.position.y, 0f); if (toggle.val) { _headp = _headControl.transform.position.y; _chestp = _chestControl.transform.position.y; _hipp = _hipControl.transform.position.y; _rHandp = _rHandControl.transform.position.y; _lHandp = _lHandControl.transform.position.y; _rFootp = _rFootControl.transform.position.y; _lFootp = _lFootControl.transform.position.y; _rElbowp = _rElbowControl.transform.position.y; _lElbowp = _lElbowControl.transform.position.y; _rKneep = _rKneeControl.transform.position.y; _lKneep = _lKneeControl.transform.position.y; _neckp = _neckControl.transform.position.y; _rArmp = _rArmControl.transform.position.y; _lArmp = _lArmControl.transform.position.y; _pelvisp = _pelvisControl.transform.position.y; _abdomenp = _abdomenControl.transform.position.y; _abdomen2p = _abdomen2Control.transform.position.y; _rThighp = _rThighControl.transform.position.y; _lThighp = _lThighControl.transform.position.y; _rToep = _rToeControl.transform.position.y; _lToep = _lToeControl.transform.position.y; _base = Mathf.Min(_headp, _chestp, _hipp, _rHandp, _lHandp, _rFootp, _lFootp, _rElbowp, _lElbowp, _rKneep, _lKneep, _neckp, _rArmp, _lArmp, _pelvisp, _abdomenp, _abdomen2p, _rThighp, _lThighp, _rToep, _lToep) - slider2.val; _baseV = new Vector3(0f, _base, 0f); _headControl.transform.position -= _baseV - _controlPosition; _chestControl.transform.position -= _baseV - _controlPosition; _hipControl.transform.position -= _baseV - _controlPosition; _rHandControl.transform.position -= _baseV - _controlPosition; _lHandControl.transform.position -= _baseV - _controlPosition; _rFootControl.transform.position -= _baseV - _controlPosition; _lFootControl.transform.position -= _baseV - _controlPosition; _rElbowControl.transform.position -= _baseV - _controlPosition; _lElbowControl.transform.position -= _baseV - _controlPosition; _rKneeControl.transform.position -= _baseV - _controlPosition; _lKneeControl.transform.position -= _baseV - _controlPosition; _neckControl.transform.position -= _baseV - _controlPosition; _rArmControl.transform.position -= _baseV - _controlPosition; _lArmControl.transform.position -= _baseV - _controlPosition; _pelvisControl.transform.position -= _baseV - _controlPosition; _abdomenControl.transform.position -= _baseV - _controlPosition; _abdomen2Control.transform.position -= _baseV - _controlPosition; _rThighControl.transform.position -= _baseV - _controlPosition; _lThighControl.transform.position -= _baseV - _controlPosition; _rToeControl.transform.position -= _baseV - _controlPosition; _lToeControl.transform.position -= _baseV - _controlPosition; _rShoulderControl.transform.position -= _baseV - _controlPosition; _lShoulderControl.transform.position -= _baseV - _controlPosition; } if (toggle3.val) { _controlControl.transform.position -= _controlPosition; } } } public void OnDestroy() { // Call this when this plugin should not receive shortcuts anymore SuperController.singleton.BroadcastMessage("OnActionsProviderDestroyed", this, SendMessageOptions.DontRequireReceiver); } public void OnBindingsListRequested(List bindings) { bindings.Add(new JSONStorableAction("MoveControlToBody", () => MoveControls())); } } }