using System; using UnityEngine; using System.Collections; using System.Collections.Generic; using SimpleJSON; using System.Linq; namespace ExtraltodeusPlugin { public class HeadLightLink : MVRScript { #region PluginInfo public string OriginalPluginAuthor = "Extraltodeus"; public string OriginalPluginName = "HeadLight"; public string pluginAuthor = "ky1001"; public string pluginName = "HeadLightLink"; public string pluginVersion = "5.0"; public string pluginDate = "2023-01-20"; public string pluginDescription = "I modified it so that it can be Parent Link based on HeadLight.cs made by Extraltodeus."; #endregion private JSONStorableFloat X; private JSONStorableFloat Y; private JSONStorableFloat Z; private JSONStorableFloat Xa; private JSONStorableFloat Ya; private JSONStorableFloat Za; private UIDynamicSlider sX; private UIDynamicSlider sY; private UIDynamicSlider sZ; private UIDynamicSlider sXa; private UIDynamicSlider sYa; private UIDynamicSlider sZa; private UIDynamicToggle ptoggle; private UIDynamicToggle ltoggle; private UIDynamicToggle rev_Toggle; private JSONStorableBool playingBool; private JSONStorableBool linkBool; private JSONStorableBool rev_Bool; private JSONStorableStringChooser Target; private UIDynamicPopup udp; private Vector3 pos; private Quaternion rot2; private Quaternion rot3; private Quaternion rev; private bool linkBoolval; private string currentTarget; Rigidbody linkToAtom; public override void Init() { try { X = new JSONStorableFloat("Position X adjustment", 0f, -2.0f, 2.0f, true); X.storeType = JSONStorableParam.StoreType.Full; sX = CreateSlider(X); RegisterFloat(X); sX.slider.onValueChanged.AddListener(delegate { linkBoolval = false; ChangeLink(); }); Y = new JSONStorableFloat("Position Y adjustment", 0f, -2.0f, 2.0f, true); Y.storeType = JSONStorableParam.StoreType.Full; sY = CreateSlider(Y); RegisterFloat(Y); sY.slider.onValueChanged.AddListener(delegate { linkBoolval = false; ChangeLink(); }); Z = new JSONStorableFloat("Position Z adjustment", 0f, -2.0f, 10.0f, true); Z.storeType = JSONStorableParam.StoreType.Full; sZ = CreateSlider(Z); RegisterFloat(Z); sZ.slider.onValueChanged.AddListener(delegate { linkBoolval = false; ChangeLink(); }); Xa = new JSONStorableFloat("Rotation X adjustment", 0f, -2.0f, 2.0f, true); Xa.storeType = JSONStorableParam.StoreType.Full; sXa = CreateSlider(Xa); RegisterFloat(Xa); sXa.slider.onValueChanged.AddListener(delegate { linkBoolval = false; ChangeLink(); }); Ya = new JSONStorableFloat("Rotation Y adjustment", 0f, -2.0f, 2.0f, true); Ya.storeType = JSONStorableParam.StoreType.Full; sYa = CreateSlider(Ya); RegisterFloat(Ya); sYa.slider.onValueChanged.AddListener(delegate { linkBoolval = false; ChangeLink(); }); Za = new JSONStorableFloat("Rotation Z adjustment", 0f, -2.0f, 2.0f, true); Za.storeType = JSONStorableParam.StoreType.Full; sZa = CreateSlider(Za); RegisterFloat(Za); sZa.slider.onValueChanged.AddListener(delegate { linkBoolval = false; ChangeLink(); }); playingBool = new JSONStorableBool("Play", true); playingBool.storeType = JSONStorableParam.StoreType.Full; RegisterBool(playingBool); ptoggle = CreateToggle((playingBool), true); List targetChoices = new List(); targetChoices.Add("CenterEye"); targetChoices.Add("LeftHand"); targetChoices.Add("RightHand"); for (int i = 1; i < 9; i++) { targetChoices.Add("Tracker" + i.ToString()); } Target = new JSONStorableStringChooser("Target", targetChoices, "CenterEye", "Choose Target"); Target.storeType = JSONStorableParam.StoreType.Full; RegisterStringChooser(Target); udp = CreatePopup(Target, true); linkBool = new JSONStorableBool("Parent Link", true); linkBool.storeType = JSONStorableParam.StoreType.Full; RegisterBool(linkBool); ltoggle = CreateToggle(linkBool, true); ltoggle.toggle.onValueChanged.AddListener(delegate { ChangeLink(); }); var spacer = CreateSpacer(true); spacer.height = 35f; rev_Bool = new JSONStorableBool("Reverse", false); RegisterBool(rev_Bool); rev_Toggle = CreateToggle(rev_Bool, true); rev_Toggle.toggle.onValueChanged.AddListener(delegate { linkBoolval = false; ChangeLink(); }); } catch (Exception e) { SuperController.LogError($"{nameof(HeadLightLink)}.{nameof(Init)}: {e}"); } } void Start() { linkBoolval = false; ChangeLink(); } void FixedUpdate() { try { if (ptoggle.toggle.isOn) { if (Target.val == "CenterEye") { pos = SuperController.singleton.lookCamera.transform.position; pos[0] = X.val; pos[1] = Y.val; pos[2] = Z.val; pos = SuperController.singleton.lookCamera.transform.TransformPoint(pos); rot2 = SuperController.singleton.lookCamera.transform.rotation; } else if (Target.val == "LeftHand") { pos = SuperController.singleton.leftHand.transform.position; pos[0] = X.val; pos[1] = Y.val; pos[2] = Z.val; pos = SuperController.singleton.leftHand.transform.TransformPoint(pos); rot2 = SuperController.singleton.leftHand.transform.rotation; } else if (Target.val == "RightHand") { pos = SuperController.singleton.rightHand.transform.position; pos[0] = X.val; pos[1] = Y.val; pos[2] = Z.val; pos = SuperController.singleton.rightHand.transform.TransformPoint(pos); rot2 = SuperController.singleton.rightHand.transform.rotation; } else if (Target.val == "Tracker1") { pos = SuperController.singleton.viveTracker1.transform.position; pos[0] = X.val; pos[1] = Y.val; pos[2] = Z.val; pos = SuperController.singleton.viveTracker1.transform.TransformPoint(pos); rot2 = SuperController.singleton.viveTracker1.transform.rotation; } else if (Target.val == "Tracker2") { pos = SuperController.singleton.viveTracker2.transform.position; pos[0] = X.val; pos[1] = Y.val; pos[2] = Z.val; pos = SuperController.singleton.viveTracker2.transform.TransformPoint(pos); rot2 = SuperController.singleton.viveTracker2.transform.rotation; } else if (Target.val == "Tracker3") { pos = SuperController.singleton.viveTracker3.transform.position; pos[0] = X.val; pos[1] = Y.val; pos[2] = Z.val; pos = SuperController.singleton.viveTracker3.transform.TransformPoint(pos); rot2 = SuperController.singleton.viveTracker3.transform.rotation; } else if (Target.val == "Tracker4") { pos = SuperController.singleton.viveTracker4.transform.position; pos[0] = X.val; pos[1] = Y.val; pos[2] = Z.val; pos = SuperController.singleton.viveTracker4.transform.TransformPoint(pos); rot2 = SuperController.singleton.viveTracker4.transform.rotation; } else if (Target.val == "Tracker5") { pos = SuperController.singleton.viveTracker5.transform.position; pos[0] = X.val; pos[1] = Y.val; pos[2] = Z.val; pos = SuperController.singleton.viveTracker5.transform.TransformPoint(pos); rot2 = SuperController.singleton.viveTracker5.transform.rotation; } else if (Target.val == "Tracker6") { pos = SuperController.singleton.viveTracker6.transform.position; pos[0] = X.val; pos[1] = Y.val; pos[2] = Z.val; pos = SuperController.singleton.viveTracker6.transform.TransformPoint(pos); rot2 = SuperController.singleton.viveTracker6.transform.rotation; } else if (Target.val == "Tracker7") { pos = SuperController.singleton.viveTracker7.transform.position; pos[0] = X.val; pos[1] = Y.val; pos[2] = Z.val; pos = SuperController.singleton.viveTracker7.transform.TransformPoint(pos); rot2 = SuperController.singleton.viveTracker7.transform.rotation; } else if (Target.val == "Tracker8") { pos = SuperController.singleton.viveTracker8.transform.position; pos[0] = X.val; pos[1] = Y.val; pos[2] = Z.val; pos = SuperController.singleton.viveTracker8.transform.TransformPoint(pos); rot2 = SuperController.singleton.viveTracker8.transform.rotation; } if (rev_Bool.val) { rev = Quaternion.Euler(0f, 180f, 0f); } else { rev = Quaternion.Euler(0f, 0f, 0f); } containingAtom.GetStorableByID("control").transform.position = pos; rot3 = Quaternion.Euler(Xa.val * 90f, Ya.val * 90f, Za.val * 90f); containingAtom.GetStorableByID("control").transform.rotation = rot2 * rot3 * rev; } else { linkBool.val = false; } if (linkBool.val == false) { linkBoolval = false; ChangeLink(); } else { linkBoolval = true; ChangeLink(); } if (currentTarget != Target.val) { currentTarget = Target.val; //SuperController.LogMessage("Target Change"); ChangeLink(); } } catch (Exception e) { SuperController.LogError("Exception caught: " + e); } } void ChangeLink() { if (linkBoolval) { ChangeTarget(); } else { StopLink(); } } void ChangeTarget() { FreeControllerV3 Control = containingAtom.GetStorableByID("control") as FreeControllerV3; Control.currentPositionState = FreeControllerV3.PositionState.ParentLink; Control.currentRotationState = FreeControllerV3.RotationState.ParentLink; linkToAtom = SuperController.singleton.RigidbodyNameToRigidbody("[CameraRig]:" + Target.val); Control.SelectLinkToRigidbody(linkToAtom, FreeControllerV3.SelectLinkState.PositionAndRotation); } void StopLink() { FreeControllerV3 Control = containingAtom.GetStorableByID("control") as FreeControllerV3; Control.currentPositionState = FreeControllerV3.PositionState.On; Control.currentRotationState = FreeControllerV3.RotationState.On; linkToAtom = SuperController.singleton.RigidbodyNameToRigidbody("None:None"); Control.SelectLinkToRigidbody(linkToAtom, FreeControllerV3.SelectLinkState.PositionAndRotation); } public void OnDisable() { try { StopLink(); } catch (Exception e) { SuperController.LogError("Exception caught: " + e); } } } }