using System.IO; using UnityEditor; using UnityEngine; namespace Passer.Humanoid { using Passer.Tracking; public class UnityXR_Editor : Tracker_Editor { #if pUNITYXR #region Tracker public class TrackerProps : HumanoidControl_Editor.HumanoidTrackerProps { #if hOCHAND readonly private SerializedProperty oculusHandTrackingProp; #endif #if hVIVEHAND readonly private SerializedProperty viveHandTrackingProp; #endif public TrackerProps(SerializedObject serializedObject, HumanoidControl_Editor.HumanoidTargetObjs targetObjs, UnityXRTracker _unityXR) : base(serializedObject, targetObjs, _unityXR, nameof(HumanoidControl.unityXR)) { tracker = _unityXR; #if hOCHAND oculusHandTrackingProp = serializedObject.FindProperty("unityXR.oculusHandTracking"); CheckQuestManifest(); #endif #if hVIVEHAND viveHandTrackingProp = serializedObject.FindProperty("unityXR.viveHandTracking"); #endif } public override void Inspector(HumanoidControl humanoid) { Inspector(humanoid, "Unity XR"); if (enabledProp.boolValue) { EditorGUI.indentLevel++; TrackerInspector(humanoid, humanoid.unityXR); HandTrackingInspector(humanoid); EditorGUI.indentLevel--; } } protected void HandTrackingInspector(HumanoidControl humanoid) { OculusHandTrackingInspector(); ViveHandTrackingInspector(humanoid); } protected void OculusHandTrackingInspector() { #if hOCHAND GUIContent labelText = new GUIContent( "Oculus Hand Tracking", "Enables hand tracking on the Oculus Quest" ); oculusHandTrackingProp.boolValue = EditorGUILayout.ToggleLeft(labelText, oculusHandTrackingProp.boolValue); #endif } protected virtual void CheckQuestManifest() { string manifestPath = Application.dataPath + "/Plugins/Android/AndroidManifest.xml"; FileInfo fileInfo = new FileInfo(manifestPath); fileInfo.Directory.Create(); bool manifestAvailable = File.Exists(manifestPath); if (manifestAvailable) return; string humanoidPath = Configuration_Editor.FindHumanoidFolder(); string questManifestPath = Application.dataPath + humanoidPath + "Extensions/Oculus/QuestManifest.xml"; File.Copy(questManifestPath, manifestPath); } protected void ViveHandTrackingInspector(HumanoidControl humanoid) { #if hVIVEHAND GUIContent labelText = new GUIContent( "Vive Hand Tracking", "Enables hand tracking on the HTC Vive" ); viveHandTrackingProp.boolValue = EditorGUILayout.ToggleLeft(labelText, viveHandTrackingProp.boolValue); // When using vive hand tracking, the GestureProvider should be added to the UnityXR component // before the scene starts. So we need to add it in the edito // and we need to have the unityXR component in the scene if (viveHandTrackingProp.boolValue == true) { humanoid.unityXR.CheckTracker(humanoid, UnityXR.Get); ViveHandSkeleton.CheckGestureProvider(humanoid.unityXR.trackerComponent); } #endif } } #endregion #region Head public class HeadTargetProps : HeadTarget_Editor.TargetProps { readonly SerializedProperty hmdProp; public HeadTargetProps(SerializedObject serializedObject, HeadTarget headTarget) : base(serializedObject, headTarget.unityXR, headTarget, nameof(HeadTarget.unityXR)) { hmdProp = serializedObject.FindProperty(nameof(HeadTarget.unityXR) + ".hmd"); } public override void Inspector() { if (!headTarget.humanoid.unityXR.enabled) return; enabledProp.boolValue = HumanoidTarget_Editor.ControllerInspector(headTarget.unityXR, headTarget); headTarget.unityXR.enabled = enabledProp.boolValue; if (enabledProp.boolValue) { EditorGUI.indentLevel++; if (headTarget.unityXR.hmd == null) { // Hmd does not exist using (new EditorGUILayout.HorizontalScope()) { EditorGUILayout.LabelField("Hmd", GUILayout.Width(120)); if (GUILayout.Button("Show")) { headTarget.unityXR.CheckSensor(headTarget); } } } else hmdProp.objectReferenceValue = (UnityXRHmd)EditorGUILayout.ObjectField("Hmd", headTarget.unityXR.hmd, typeof(UnityXRHmd), true); EditorGUI.indentLevel--; } else headTarget.unityXR.CheckSensor(headTarget); } } #endregion #region Hand public class HandTargetProps : HandTarget_Editor.TargetProps { SerializedProperty controllerProp; public HandTargetProps(SerializedObject serializedObject, HandTarget handTarget) : base(serializedObject, handTarget.unityXR, handTarget, "unityXR") { controllerProp = serializedObject.FindProperty("unityXR.controller"); } public override void Inspector() { if (!handTarget.humanoid.unityXR.enabled) return; enabledProp.boolValue = HumanoidTarget_Editor.ControllerInspector(handTarget.unityXR, handTarget); handTarget.unityXR.enabled = enabledProp.boolValue; if (enabledProp.boolValue) { EditorGUI.indentLevel++; if (handTarget.unityXR.controller == null) { // Controller does not exist using (new EditorGUILayout.HorizontalScope()) { EditorGUILayout.LabelField("Controller", GUILayout.Width(120)); if (GUILayout.Button("Show")) { handTarget.unityXR.CheckSensor(handTarget); } } } else controllerProp.objectReferenceValue = (UnityXRController)EditorGUILayout.ObjectField("Controller", controllerProp.objectReferenceValue, typeof(UnityXRController), true); EditorGUI.indentLevel--; } else handTarget.unityXR.CheckSensor(handTarget); } } #endregion #endif } }