using System; using System.Collections.Generic; using System.IO; using System.Linq; using HurricaneVR.Framework.Core; using HurricaneVR.Framework.Core.HandPoser; using HurricaneVR.Framework.Core.Utils; using HurricaneVR.Framework.Shared; using HurricaneVR.Framework.Shared.Utilities; using UnityEditor; using UnityEditor.UIElements; using UnityEngine; using UnityEngine.UIElements; using GameObject = UnityEngine.GameObject; namespace HurricaneVR.Editor { public class HVRManagementWindow : EditorWindow { private ObjectField grabbableObjectField; private ObjectField posableObjectField; private ObjectField grabPointsObjectField; private UnityEditor.Editor _poserEditor; private VisualElement _poserRoot; private TextField _recordedPrefixTextBox; private VisualElement _root; private ScrollView _scrollView; [MenuItem("Tools/HurricaneVR/Posing")] public static void ShowExample() { HVRManagementWindow wnd = GetWindow(); wnd.titleContent = new GUIContent("HVR Posing"); } public const string GrabbleName = "VRPoser_Grabbable"; public GameObject SelectedGrabPoints { get { var obj = grabPointsObjectField.value as GameObject; return obj; } } public GameObject SelectedPoser { get { return posableObjectField.value as GameObject; } } public GameObject SelectedGrabbable { get { return grabbableObjectField.value as GameObject; } } private void OnDestroy() { } public void OnEnable() { _root = rootVisualElement; var visualTree = UnityEngine.Resources.Load("HVRManagementWindow"); _root.Add(visualTree.CloneTree()); _scrollView = _root.Q("ScrollView"); SetupObjectFields(_root); SetupFocusButtons(_root); SetupAddPoser(_root); SetupPoseSelected(_root); var list = _root.Q("RecordedPoses"); list.styleSheets.Add(Resources.Load("HVRManagementWindow")); _recordedPrefixTextBox = _root.Q("RecordedPrefixTextBox"); SetupButtons(_root); } public ListView PosesListView { get; set; } private List Poses { get; set; } private void SetupPosesListView(List poses) { var posesParent = GameObject.Find("RecordedPosesCloneHolder"); if (!posesParent) { posesParent = new GameObject("RecordedPosesCloneHolder"); } foreach (Transform child in posesParent.transform) { DestroyImmediate(child.gameObject); } Poses = poses; var listview = _root.Q("RecordedPoses"); listview.Clear(); foreach (var pose in poses) { var row = new VisualElement(); row.AddToClassList("poserow"); var field = new ObjectField("Pose:"); field.objectType = typeof(HVRHandPose); field.value = pose; row.Add(field); field.AddToClassList("poserow-field"); var clone = Instantiate(HVRSettings.Instance.GetPoserHand(pose.SnappedLeft ? HVRHandSide.Left : HVRHandSide.Right), posesParent.transform, true); var posableHand = clone.GetComponent(); if (posableHand != null) { posableHand.Pose(pose); } var attach = new Button(() => { if (!SelectedGrabPoints) { EditorUtility.DisplayDialog("Error!", "Please set GrabPoints field.", "Ok!"); return; } var grabPoint = new GameObject("GrabPoint"); grabPoint.transform.parent = SelectedGrabPoints.transform; grabPoint.transform.localPosition = Vector3.zero; var poser = grabPoint.AddComponent(); var posable = grabPoint.AddComponent(); posable.HandPoser = poser; grabPoint.transform.localPosition = Vector3.zero;//.position = pose.SnappedLeft ? pose.LeftHand.Position : pose.RightHand.Position; grabPoint.transform.localRotation = Quaternion.identity; var clonedPose = posableHand.CreateFullHandPose(posableHand.MirrorAxis); clonedPose.RightHand.Rotation = Quaternion.Inverse(grabPoint.transform.rotation) * clonedPose.RightHand.Rotation; clonedPose.LeftHand.Rotation = Quaternion.Inverse(grabPoint.transform.rotation) * clonedPose.LeftHand.Rotation; clonedPose.RightHand.Position = Vector3.zero; clonedPose.LeftHand.Position = Vector3.zero; poser.PrimaryPose = new HVRHandPoseBlend(); poser.PrimaryPose.Pose = clonedPose; poser.PrimaryPose.SetDefaults(); var grabbable = grabPoint.GetComponentInParent(); string name; if (grabbable) { name = grabbable.name + "-" + pose.name; } else { name = DateTime.Now.Ticks.ToString(); } poser.PrimaryPose.Pose = HVRSettings.Instance.SavePoseToDefault(clonedPose, name, ""); //EditorUtility.SetDirty(pose); //AssetDatabase.SaveAssets(); //AssetDatabase.Refresh(); }) { text = "Attach" }; var delete = new Button(() => { row.RemoveFromHierarchy(); DestroyImmediate(clone); }) { text = "-" }; var focus = new Button(() => { Selection.activeGameObject = clone; SceneView.FrameLastActiveSceneView(); }) { text = "Focus" }; attach.AddToClassList("poserow-button"); delete.AddToClassList("poserow-button"); focus.AddToClassList("poserow-button"); row.Add(focus); row.Add(attach); row.Add(delete); listview.Insert(listview.childCount, row); } } private void SetupButtons(VisualElement root) { var button = root.Q