_xiaofang/xiaofang/Assets/Obi/Editor/Common/Constraints/ObiConstraintParametersDrawer.cs
杨号敬 bcc74f0465 add
2024-12-18 02:18:45 +08:00

74 lines
2.9 KiB
C#

using UnityEngine;
using UnityEditor;
using System;
namespace Obi
{
[CustomPropertyDrawer(typeof(Oni.ConstraintParameters))]
public class ObiConstraintParametersDrawer : PropertyDrawer
{
public static float padding = 4;
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
{
float propHeight = EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
EditorGUI.BeginProperty(position, label, property);
SerializedProperty enabled = property.FindPropertyRelative("enabled");
Rect contRect = new Rect(position.x+padding, position.y+padding, position.width-padding*2, propHeight);
// Draw a box around the parameters:
GUI.enabled = enabled.boolValue;
GUI.Box(position,"",ObiEditorUtils.GetToggleablePropertyGroupStyle());
GUI.enabled = true;
// Draw main constraint toggle:
EditorGUI.BeginProperty(position, label, enabled);
EditorGUI.BeginChangeCheck();
var newEnabled = EditorGUI.ToggleLeft(contRect, label.text, enabled.boolValue, EditorStyles.boldLabel);
// Only assign the value back if it was actually changed by the user.
// Otherwise a single value will be assigned to all objects when multi-object editing,
// even when the user didn't touch the control.
if (EditorGUI.EndChangeCheck())
{
enabled.boolValue = newEnabled;
}
EditorGUI.EndProperty();
if (enabled.boolValue){
Rect evalRect = new Rect(position.x+padding, position.y+propHeight+padding, position.width-padding*2, propHeight);
Rect iterRect = new Rect(position.x+padding, position.y+propHeight*2+padding, position.width-padding*2, propHeight);
Rect sorRect = new Rect(position.x+padding, position.y+propHeight*3+padding, position.width-padding*2, EditorGUIUtility.singleLineHeight);
EditorGUI.indentLevel++;
Rect evalCtrl = EditorGUI.PrefixLabel(evalRect,new GUIContent("Evaluation"));
EditorGUI.PropertyField(evalCtrl, property.FindPropertyRelative("evaluationOrder"),GUIContent.none);
Rect iterCtrl = EditorGUI.PrefixLabel(iterRect,new GUIContent("Iterations"));
EditorGUI.PropertyField(iterCtrl, property.FindPropertyRelative("iterations"),GUIContent.none);
Rect sorCtrl = EditorGUI.PrefixLabel(sorRect,new GUIContent("Relaxation"));
EditorGUI.PropertyField(sorCtrl, property.FindPropertyRelative("SORFactor"),GUIContent.none);
EditorGUI.indentLevel--;
}
EditorGUI.EndProperty();
}
public override float GetPropertyHeight(SerializedProperty property, GUIContent label)
{
SerializedProperty enabled = property.FindPropertyRelative("enabled");
if (enabled.boolValue)
return EditorGUIUtility.singleLineHeight*4 + EditorGUIUtility.standardVerticalSpacing*3 + padding*2;
else
return EditorGUIUtility.singleLineHeight + padding*2;
}
}
}