Pascal Serrarens 17741d862a First commit
2022-01-12 10:50:57 +01:00

185 lines
7.0 KiB
C#

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
}
}