Assignment for RMIT Mixed Reality in 2020
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

80 lines
3.2 KiB

namespace VRTK
{
using UnityEngine;
using UnityEditor;
using System.Globalization;
using Supyrb;
[CustomPropertyDrawer(typeof(MinMaxRangeAttribute))]
class MinMaxRangeDrawer : PropertyDrawer
{
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
{
label.tooltip = VRTK_EditorUtilities.GetTooltipAttribute(fieldInfo).tooltip;
bool foundGeneric = false;
bool valid = false;
try
{
Vector2 input = SerializedPropertyExtensions.GetValue<Limits2D>(property).AsVector2();
Vector2 output = BuildSlider(position, label, input, out valid);
if (valid)
{
SerializedPropertyExtensions.SetValue<Limits2D>(property, new Limits2D(output));
}
foundGeneric = true;
}
catch (System.Exception)
{
Error(position, label);
}
if (!foundGeneric)
{
switch (property.propertyType)
{
case SerializedPropertyType.Vector2:
Vector2 input = property.vector2Value;
Vector2 output = BuildSlider(position, label, input, out valid);
if (valid)
{
property.vector2Value = output;
}
break;
default:
Error(position, label);
break;
}
}
}
private Vector2 BuildSlider(Rect position, GUIContent label, Vector2 range, out bool valid)
{
float fieldWidth = GUI.skin.textField.CalcSize(new GUIContent(1.23456f.ToString(CultureInfo.InvariantCulture))).x; ;
float fieldPadding = 5f;
float min = range.x;
float max = range.y;
MinMaxRangeAttribute attr = attribute as MinMaxRangeAttribute;
EditorGUI.BeginChangeCheck();
Rect updatedPosition = EditorGUI.PrefixLabel(position, GUIUtility.GetControlID(FocusType.Passive), label);
min = EditorGUI.FloatField(new Rect(updatedPosition.x, updatedPosition.y, fieldWidth, updatedPosition.height), Mathf.Clamp(min, attr.min, attr.max));
EditorGUI.MinMaxSlider(new Rect(updatedPosition.x + (fieldWidth + fieldPadding), updatedPosition.y, updatedPosition.width - ((fieldWidth + fieldPadding) * 2f), updatedPosition.height), ref min, ref max, attr.min, attr.max);
max = EditorGUI.FloatField(new Rect(updatedPosition.x + (updatedPosition.width - fieldWidth), updatedPosition.y, fieldWidth, updatedPosition.height), Mathf.Clamp(max, attr.min, attr.max));
if (EditorGUI.EndChangeCheck())
{
range.x = min;
range.y = max;
valid = true;
return range;
}
valid = false;
return Vector2.zero;
}
private void Error(Rect position, GUIContent label)
{
EditorGUI.LabelField(position, label, new GUIContent("Use only with Vector2 or Limits2D"));
}
}
}