HumanoidControl_Free/Editor/HumanoidFree/Targets/HumanoidTarget_Editor.cs
Pascal Serrarens 17741d862a First commit
2022-01-12 10:50:57 +01:00

390 lines
17 KiB
C#

using UnityEditor;
using UnityEngine;
namespace Passer.Humanoid {
public static class HumanoidTarget_Editor {
public static Target Inspector(Target target, string name) {
if (target == null)
return target;
EditorGUILayout.BeginHorizontal();
Transform defaultTargetTransform = null; // target.GetDefaultTarget(target.humanoid);
Transform targetTransform = target.transform ?? defaultTargetTransform;
targetTransform = (Transform)EditorGUILayout.ObjectField(name, targetTransform, typeof(Transform), true);
if (!Application.isPlaying) {
if (targetTransform == defaultTargetTransform && GUILayout.Button("Show", GUILayout.MaxWidth(60))) {
// Call static method CreateTarget on target
target = (HumanoidTarget)target.GetType().GetMethod("CreateTarget").Invoke(null, new object[] { target });
//} else if (targetTransform != target.transform) {
// target = (HumanoidTarget)target.GetType().GetMethod("SetTarget").Invoke(null, new object[] { target.humanoid, targetTransform });
}
}
EditorGUILayout.EndHorizontal();
return target;
}
public static HumanoidTarget Inspector(HumanoidTarget target, string name) {
if (target == null)
return target;
EditorGUILayout.BeginHorizontal();
Transform defaultTargetTransform = target.GetDefaultTarget(target.humanoid);
Transform targetTransform = target.transform ?? defaultTargetTransform;
GUIContent text = new GUIContent(
name,
"The transform controlling the " + name
);
targetTransform = (Transform)EditorGUILayout.ObjectField(text, targetTransform, typeof(Transform), true);
if (!Application.isPlaying) {
if (targetTransform == defaultTargetTransform && GUILayout.Button("Show", GUILayout.MaxWidth(60))) {
// Call static method CreateTarget on target
target = (HumanoidTarget)target.GetType().GetMethod("CreateTarget").Invoke(null, new object[] { target });
} else if (targetTransform != target.transform) {
target = (HumanoidTarget)target.GetType().GetMethod("SetTarget").Invoke(null, new object[] { target.humanoid, targetTransform });
}
}
EditorGUILayout.EndHorizontal();
return target;
}
public static bool ControllerInspector(HumanoidSensor controller) {
EditorGUILayout.BeginHorizontal();
controller.enabled = EditorGUILayout.ToggleLeft(controller.name, controller.enabled, GUILayout.MinWidth(80));
if (controller.enabled && Application.isPlaying)
EditorGUILayout.EnumPopup(controller.status);
EditorGUILayout.EndHorizontal();
return controller.enabled;
}
public static bool ControllerInspector(HumanoidSensor controller, Target target) {
EditorGUILayout.BeginHorizontal();
EditorGUI.BeginChangeCheck();
GUIContent text = new GUIContent(
controller.name,
"Activate " + controller.name + " support for this humanoid"
);
bool enabled = EditorGUILayout.ToggleLeft(text, controller.enabled, GUILayout.MinWidth(80));
if (EditorGUI.EndChangeCheck()) {
Undo.RecordObject(target, enabled ? "Enabled " : "Disabled " + controller.name);
controller.enabled = enabled;
}
if (Application.isPlaying && enabled)
EditorGUILayout.EnumPopup(controller.status);
EditorGUILayout.EndHorizontal();
return enabled;
}
public static void BoneAngleInspector(SerializedProperty minProperty, SerializedProperty maxProperty, float defaultMin, float defaultMax, string boneAxisName, string label) {
float min = minProperty.floatValue;
float max = maxProperty.floatValue;
EditorGUI.BeginChangeCheck();
EditorGUILayout.BeginHorizontal();
EditorGUILayout.LabelField(label, GUILayout.MinWidth(70));
min = EditorGUILayout.FloatField(min, GUILayout.Width(65));
GUI.SetNextControlName(boneAxisName + "1");
EditorGUILayout.MinMaxSlider(ref min, ref max, -180, 180);
GUI.SetNextControlName(boneAxisName + "2");
max = EditorGUILayout.FloatField(max, GUILayout.Width(65));
if (GUILayout.Button("R")) {
min = defaultMin;
max = defaultMax;
GUI.FocusControl(boneAxisName + "1");
}
EditorGUILayout.EndHorizontal();
if (EditorGUI.EndChangeCheck()) {
minProperty.floatValue = min;
maxProperty.floatValue = max;
}
SceneView.RepaintAll();
}
public static void BoneXAngleInspector(HumanoidTarget.TargetedBone bone, float defaultMin, float defaultMax) {
float oldMin = bone.bone.minAngles.x;
float oldMax = bone.bone.maxAngles.x;
EditorGUILayout.BeginHorizontal();
EditorGUILayout.LabelField("X Limits", GUILayout.MinWidth(70));
GUI.SetNextControlName(bone.bone.transform.name + "X1");
bone.bone.minAngles.x = EditorGUILayout.FloatField(bone.bone.minAngles.x, GUILayout.Width(65));
EditorGUILayout.MinMaxSlider(ref bone.bone.minAngles.x, ref bone.bone.maxAngles.x, -180, 180);
GUI.SetNextControlName(bone.bone.transform.name + "X2");
bone.bone.maxAngles.x = EditorGUILayout.FloatField(bone.bone.maxAngles.x, GUILayout.Width(65));
if (GUILayout.Button("R")) {
bone.bone.minAngles.x = defaultMin;
bone.bone.maxAngles.x = defaultMax;
GUI.FocusControl(bone.bone.transform.name + "X1");
}
EditorGUILayout.EndHorizontal();
if (bone.bone.maxAngles.x != oldMax || bone.bone.minAngles.x != oldMin)
SceneView.RepaintAll();
}
public static void BoneYAngleInspector(HumanoidTarget.TargetedBone bone, float defaultMin, float defaultMax) {
float oldMin = bone.bone.minAngles.y;
float oldMax = bone.bone.maxAngles.y;
EditorGUILayout.BeginHorizontal();
EditorGUILayout.LabelField("Y Limits", GUILayout.MinWidth(70));
GUI.SetNextControlName(bone.bone.transform.name + "Y1");
bone.bone.minAngles.y = EditorGUILayout.FloatField(bone.bone.minAngles.y, GUILayout.Width(65));
EditorGUILayout.MinMaxSlider(ref bone.bone.minAngles.y, ref bone.bone.maxAngles.y, -180, 180);
GUI.SetNextControlName(bone.bone.transform.name + "Y2");
bone.bone.maxAngles.y = EditorGUILayout.FloatField(bone.bone.maxAngles.y, GUILayout.Width(65));
if (GUILayout.Button("R")) {
bone.bone.minAngles.y = defaultMin;
bone.bone.maxAngles.y = defaultMax;
GUI.FocusControl(bone.bone.transform.name + "Y1");
}
EditorGUILayout.EndHorizontal();
if (bone.bone.maxAngles.y != oldMax || bone.bone.minAngles.y != oldMin)
SceneView.RepaintAll();
}
public static void BoneYAngleInspector(HumanoidTarget.TargetedBone bone, SerializedProperty minProperty, SerializedProperty maxProperty, float defaultMin, float defaultMax) {
float min = minProperty.floatValue;
float max = maxProperty.floatValue;
EditorGUI.BeginChangeCheck();
EditorGUILayout.BeginHorizontal();
EditorGUILayout.LabelField("Limits Y", GUILayout.MinWidth(70));
min = EditorGUILayout.FloatField(min, GUILayout.Width(65));
GUI.SetNextControlName(bone.bone.transform.name + "Y1");
EditorGUILayout.MinMaxSlider(ref min, ref max, -180, 180);
GUI.SetNextControlName(bone.bone.transform.name + "Y2");
max = EditorGUILayout.FloatField(max, GUILayout.Width(65));
if (GUILayout.Button("R")) {
min = defaultMin;
max = defaultMax;
GUI.FocusControl(bone.bone.transform.name + "Y1");
}
EditorGUILayout.EndHorizontal();
if (EditorGUI.EndChangeCheck()) {
minProperty.floatValue = min;
maxProperty.floatValue = max;
SceneView.RepaintAll();
}
}
public static void BoneZAngleInspector(HumanoidTarget.TargetedBone bone, float defaultMin, float defaultMax) {
float oldMin = bone.bone.minAngles.z;
float oldMax = bone.bone.maxAngles.z;
EditorGUILayout.BeginHorizontal();
EditorGUILayout.LabelField("Z Limits", GUILayout.MinWidth(70));
GUI.SetNextControlName(bone.bone.transform.name + "Z1");
bone.bone.minAngles.z = EditorGUILayout.FloatField(bone.bone.minAngles.z, GUILayout.Width(65));
EditorGUILayout.MinMaxSlider(ref bone.bone.minAngles.z, ref bone.bone.maxAngles.z, -180, 180);
GUI.SetNextControlName(bone.bone.transform.name + "Z2");
bone.bone.maxAngles.z = EditorGUILayout.FloatField(bone.bone.maxAngles.z, GUILayout.Width(65));
if (GUILayout.Button("R")) {
bone.bone.minAngles.z = defaultMin;
bone.bone.maxAngles.z = defaultMax;
GUI.FocusControl(bone.bone.transform.name + "Z1");
}
EditorGUILayout.EndHorizontal();
if (bone.bone.maxAngles.y != oldMax || bone.bone.minAngles.y != oldMin)
SceneView.RepaintAll();
}
public static void BoneZAngleInspector(HumanoidTarget.TargetedBone bone, SerializedProperty minProperty, SerializedProperty maxProperty, float defaultMin, float defaultMax) {
float min = minProperty.floatValue;
float max = maxProperty.floatValue;
EditorGUI.BeginChangeCheck();
EditorGUILayout.BeginHorizontal();
EditorGUILayout.LabelField("Limits Z", GUILayout.MinWidth(70));
min = EditorGUILayout.FloatField(min, GUILayout.Width(65));
GUI.SetNextControlName(bone.bone.transform.name + "Z1");
EditorGUILayout.MinMaxSlider(ref min, ref max, -180, 180);
GUI.SetNextControlName(bone.bone.transform.name + "Z2");
max = EditorGUILayout.FloatField(max, GUILayout.Width(65));
if (GUILayout.Button("R")) {
min = defaultMin;
max = defaultMax;
GUI.FocusControl(bone.bone.transform.name + "Z1");
}
EditorGUILayout.EndHorizontal();
if (EditorGUI.EndChangeCheck()) {
minProperty.floatValue = min;
maxProperty.floatValue = max;
SceneView.RepaintAll();
}
}
//public static void DrawTargetBone(HumanoidTarget.TargetedBone bone) {
// if (bone.target.transform != null) {
// Handles.color = Color.white;
// Handles.DrawLine(bone.target.transform.position, bone.target.transform.position + bone.target.transform.rotation * bone.target.normalDirection * bone.bone.length);
// }
//}
#region xArcs
public static void DrawXArcs(Vector3 position, Quaternion rotation, float minAngle, float maxAngle) {
DrawXArcs(position, rotation, minAngle, maxAngle, rotation * Vector3.down);
}
public static void DrawXArcs(Vector3 position, Quaternion rotation, float minAngle, float maxAngle, Vector3 zeroDirection) {
Vector3 planeNormal = rotation * Vector3.right;
DrawXArcs(position, rotation, minAngle, maxAngle, planeNormal, zeroDirection);
}
public static void DrawXArcs(Vector3 position, Quaternion rotation, float minAngle, float maxAngle, Vector3 planeNormal, Vector3 zeroDirection) {
DrawArcs(position, rotation, minAngle, maxAngle, planeNormal, zeroDirection, Color.red);
}
#endregion
#region yArcs
public static void DrawYArcs(Vector3 position, Quaternion rotation, float minAngle, float maxAngle) {
DrawYArcs(position, rotation, minAngle, maxAngle, rotation * Vector3.forward);
}
public static void DrawYArcs(Vector3 position, Quaternion rotation, float minAngle, float maxAngle, Vector3 zeroDirection) {
Vector3 planeNormal = rotation * Vector3.up;
DrawYArcs(position, rotation, minAngle, maxAngle, planeNormal, zeroDirection);
}
public static void DrawYArcs(Vector3 position, Quaternion rotation, float minAngle, float maxAngle, Vector3 planeNormal, Vector3 zeroDirection) {
DrawArcs(position, rotation, minAngle, maxAngle, planeNormal, zeroDirection, Color.green);
}
#endregion
#region zArcs
public static void DrawZArcs(Vector3 position, Quaternion rotation, float minAngle, float maxAngle) {
DrawZArcs(position, rotation, minAngle, maxAngle, rotation * Vector3.down);
}
public static void DrawZArcs(Vector3 position, Quaternion rotation, float minAngle, float maxAngle, Vector3 zeroDirection) {
Vector3 planeNormal = rotation * Vector3.forward;
DrawZArcs(position, rotation, minAngle, maxAngle, planeNormal, zeroDirection);
}
public static void DrawZArcs(Vector3 position, Quaternion rotation, float minAngle, float maxAngle, Vector3 planeNormal, Vector3 zeroDirection) {
DrawArcs(position, rotation, minAngle, maxAngle, planeNormal, zeroDirection, Color.blue);
}
#endregion
public static void DrawArcs(Vector3 position, Quaternion rotation, float minAngle, float maxAngle, Vector3 planeNormal, Vector3 zeroDirection, Color color) {
color.a = 0.1F;
Handles.color = color;
Handles.DrawSolidArc(position, planeNormal, zeroDirection, minAngle, HandleUtility.GetHandleSize(position));
Handles.DrawSolidArc(position, planeNormal, zeroDirection, maxAngle, HandleUtility.GetHandleSize(position));
color.a = 1;
Handles.color = color;
Handles.DrawWireArc(position, planeNormal, zeroDirection, minAngle, HandleUtility.GetHandleSize(position));
Handles.DrawWireArc(position, planeNormal, zeroDirection, maxAngle, HandleUtility.GetHandleSize(position));
Handles.DrawLine(position, position + zeroDirection * HandleUtility.GetHandleSize(position));
}
#region MinMaxSlider
}
public class MinMaxSliderAttribute : PropertyAttribute {
public readonly string name;
public readonly float defaultMin;
public readonly float defaultMax;
public readonly float minLimit;
public readonly float maxLimit;
public MinMaxSliderAttribute(string _name, float _defaultMin, float _defaultMax, float _minLimit, float _maxLimit) {
name = _name;
defaultMin = _defaultMin;
defaultMax = _defaultMax;
minLimit = _minLimit;
maxLimit = _maxLimit;
}
}
[CustomPropertyDrawer(typeof(MinMaxSliderAttribute))]
class MinMaxSliderDrawer : PropertyDrawer {
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) {
if (property.propertyType == SerializedPropertyType.Vector2) {
Vector2 range = property.vector2Value;
float min = range.x;
float max = range.y;
MinMaxSliderAttribute attr = attribute as MinMaxSliderAttribute;
EditorGUI.BeginChangeCheck();
EditorGUILayout.BeginHorizontal();
EditorGUILayout.LabelField(label, GUILayout.MinWidth(70));
min = EditorGUILayout.FloatField(min, GUILayout.Width(65));
GUI.SetNextControlName(attr.name + "1");
EditorGUI.MinMaxSlider(position, label, ref min, ref max, attr.minLimit, attr.maxLimit);
GUI.SetNextControlName(attr.name + "2");
max = EditorGUILayout.FloatField(max, GUILayout.Width(65));
if (GUILayout.Button("R")) {
min = attr.defaultMin;
max = attr.defaultMax;
GUI.FocusControl(attr.name + "Y1");
}
if (EditorGUI.EndChangeCheck()) {
range.x = min;
range.y = max;
property.vector2Value = range;
}
EditorGUILayout.EndHorizontal();
} else {
EditorGUI.LabelField(position, label, "Use only with Vector2");
}
}
}
#endregion
}