cvr-props/Assets/ABI.CCK/Scripts/Editor/CCK_CVRParameterStream_Editor.cs

262 lines
13 KiB
C#
Raw Normal View History

2023-01-22 16:38:23 +01:00
using System;
using System.Collections.Generic;
using System.Linq;
using ABI.CCK.Components;
using UnityEditor;
using UnityEditorInternal;
using UnityEngine;
using AnimatorControllerParameterType = UnityEngine.AnimatorControllerParameterType;
namespace ABI.CCK.Scripts.Editor
{
[CustomEditor(typeof(CVRParameterStream))]
public class CCK_CVRParameterStream_Editor : UnityEditor.Editor
{
public static string[] coreParameters = {"MovementX", "MovementY", "Grounded", "Emote", "GestureLeft",
"GestureRight", "Toggle", "Sitting", "Crouching", "CancelEmote", "Prone", "Flying"};
private CVRParameterStream stream;
private ReorderableList list;
private CVRAvatar avatar;
private CVRSpawnable spawnable;
public override void OnInspectorGUI()
{
if (stream == null) stream = (CVRParameterStream) target;
stream.referenceType = CVRParameterStream.ReferenceType.World;
avatar = stream.transform.GetComponentInParent<CVRAvatar>();
if (avatar != null) stream.referenceType = CVRParameterStream.ReferenceType.Avatar;
spawnable = stream.transform.GetComponentInParent<CVRSpawnable>();
if (spawnable != null) stream.referenceType = CVRParameterStream.ReferenceType.Spawnable;
if (stream.referenceType != CVRParameterStream.ReferenceType.Avatar)
{
EditorGUILayout.HelpBox("This Component is currently only supported for usage on Avatars.", MessageType.Warning);
return;
}
if (list == null)
{
list = new ReorderableList(stream.entries, typeof(CVRParameterStreamEntry),
true, true, true, true);
list.drawHeaderCallback = DrawHeaderCallback;
list.drawElementCallback = DrawElementCallback;
list.elementHeightCallback = ElementHeightCallback;
}
list.DoLayoutList();
}
private float ElementHeightCallback(int index)
{
return EditorGUIUtility.singleLineHeight * 1.25f * (((int) stream.entries[index].applicationType % 5 == 1?5f:4f) +
(stream.entries[index].targetType == CVRParameterStreamEntry.TargetType.Animator ? 1f : 0f));
}
private void DrawElementCallback(Rect rect, int index, bool isactive, bool isfocused)
{
if (index >= stream.entries.Count) return;
rect.y += 2f;
switch (stream.referenceType)
{
case CVRParameterStream.ReferenceType.World:
stream.entries[index].type = (CVRParameterStreamEntry.Type) EditorGUI.EnumPopup(
new Rect(rect.x, rect.y, rect.width, EditorGUIUtility.singleLineHeight),
"Type",
stream.entries[index].type
);
rect.y += EditorGUIUtility.singleLineHeight * 1.25f;
stream.entries[index].targetType = (CVRParameterStreamEntry.TargetType) EditorGUI.Popup(
new Rect(rect.x, rect.y, rect.width, EditorGUIUtility.singleLineHeight),
"Output Type",
(int) stream.entries[index].targetType,
new []{"Animator", "VariableBuffer"}
);
rect.y += EditorGUIUtility.singleLineHeight * 1.25f;
stream.entries[index].target = (GameObject) EditorGUI.ObjectField(
new Rect(rect.x, rect.y, rect.width, EditorGUIUtility.singleLineHeight),
"Target",
stream.entries[index].target,
typeof(GameObject),
true
);
if (stream.entries[index].target)
{
switch (stream.entries[index].targetType)
{
case CVRParameterStreamEntry.TargetType.Animator:
var animator = stream.entries[index].target.GetComponent<Animator>();
if (animator == null) stream.entries[index].target = null;
break;
case CVRParameterStreamEntry.TargetType.VariableBuffer:
var varBuffer = stream.entries[index].target.GetComponent<CVRVariableBuffer>();
if (varBuffer == null) stream.entries[index].target = null;
break;
}
}
if (stream.entries[index].target != null && stream.entries[index].targetType == CVRParameterStreamEntry.TargetType.Animator)
{
rect.y += EditorGUIUtility.singleLineHeight * 1.25f;
var _rect = new Rect(rect.x, rect.y, rect.width, EditorGUIUtility.singleLineHeight);
var animator = stream.entries[index].target.GetComponent<Animator>();
var parameters = new List<string>();
parameters.Add("-none-");
var parameterIndex = 0;
if (animator != null)
{
if (animator.runtimeAnimatorController != null)
{
foreach (var parameter in ((UnityEditor.Animations.AnimatorController) animator.runtimeAnimatorController).parameters)
{
if (parameter.type == AnimatorControllerParameterType.Float ||
parameter.type == AnimatorControllerParameterType.Int ||
parameter.type == AnimatorControllerParameterType.Bool)
{
parameters.Add(parameter.name);
}
}
parameterIndex = parameters.FindIndex(match => match == stream.entries[index].parameterName);
}
}
if (parameterIndex < 0) parameterIndex = 0;
parameterIndex = EditorGUI.Popup(_rect, "Parameter", parameterIndex, parameters.ToArray());
stream.entries[index].parameterName = parameters[parameterIndex];
}
break;
case CVRParameterStream.ReferenceType.Avatar:
stream.entries[index].type = (CVRParameterStreamEntry.Type) EditorGUI.EnumPopup(
new Rect(rect.x, rect.y, rect.width, EditorGUIUtility.singleLineHeight),
"Type",
stream.entries[index].type
);
rect.y += EditorGUIUtility.singleLineHeight * 1.25f;
var _rectA = new Rect(rect.x, rect.y, rect.width, EditorGUIUtility.singleLineHeight);
EditorGUI.LabelField(_rectA, "Output Type", "AdvancedAvatarAnimator");
rect.y += EditorGUIUtility.singleLineHeight * 1.25f;
stream.entries[index].targetType = CVRParameterStreamEntry.TargetType.AvatarAnimator;
_rectA = new Rect(rect.x, rect.y, rect.width, EditorGUIUtility.singleLineHeight);
var parametersA = new List<string>();
parametersA.Add("-none-");
var parameterIndexA = 0;
if (avatar != null)
{
if (avatar.overrides != null)
{
foreach (var parameter in ((UnityEditor.Animations.AnimatorController) avatar.overrides.runtimeAnimatorController).parameters)
{
if ((parameter.type == AnimatorControllerParameterType.Float ||
parameter.type == AnimatorControllerParameterType.Int ||
parameter.type == AnimatorControllerParameterType.Bool) &&
!coreParameters.Contains(parameter.name))
{
parametersA.Add(parameter.name);
}
}
parameterIndexA = parametersA.FindIndex(match => match == stream.entries[index].parameterName);
}
}
if (parameterIndexA < 0) parameterIndexA = 0;
parameterIndexA = EditorGUI.Popup(_rectA, "Parameter", parameterIndexA, parametersA.ToArray());
stream.entries[index].parameterName = parametersA[parameterIndexA];
rect.y += EditorGUIUtility.singleLineHeight * 1.25f;
stream.entries[index].applicationType = (CVRParameterStreamEntry.ApplicationType) EditorGUI.EnumPopup(
new Rect(rect.x, rect.y, rect.width, EditorGUIUtility.singleLineHeight),
"Value Application",
stream.entries[index].applicationType
);
if ((int) stream.entries[index].applicationType % 5 == 1)
{
rect.y += EditorGUIUtility.singleLineHeight * 1.25f;
stream.entries[index].staticValue = EditorGUI.FloatField(
new Rect(rect.x, rect.y, rect.width, EditorGUIUtility.singleLineHeight),
"Static Value",
stream.entries[index].staticValue
);
}
break;
case CVRParameterStream.ReferenceType.Spawnable:
stream.entries[index].type = (CVRParameterStreamEntry.Type) EditorGUI.EnumPopup(
new Rect(rect.x, rect.y, rect.width, EditorGUIUtility.singleLineHeight),
"Type",
stream.entries[index].type
);
rect.y += EditorGUIUtility.singleLineHeight * 1.25f;
var _rectB = new Rect(rect.x, rect.y, rect.width, EditorGUIUtility.singleLineHeight);
EditorGUI.LabelField(_rectB, "Output Type", "SpawnableCustomFloat");
rect.y += EditorGUIUtility.singleLineHeight * 1.25f;
stream.entries[index].targetType = CVRParameterStreamEntry.TargetType.CustomFloat;
_rectB = new Rect(rect.x, rect.y, rect.width, EditorGUIUtility.singleLineHeight);
var parametersB = new List<string>();
parametersB.Add("-none-");
var parameterIndexB = 0;
if (spawnable != null)
{
foreach (var parameter in spawnable.syncValues)
{
if (!String.IsNullOrWhiteSpace(parameter.name))
{
parametersB.Add(parameter.name);
}
}
parameterIndexB = parametersB.FindIndex(match => match == stream.entries[index].parameterName);
}
if (parameterIndexB < 0) parameterIndexB = 0;
parameterIndexB = EditorGUI.Popup(_rectB, "Parameter", parameterIndexB, parametersB.ToArray());
stream.entries[index].parameterName = parametersB[parameterIndexB];
break;
}
}
private void DrawHeaderCallback(Rect rect)
{
Rect _rect = new Rect(rect.x, rect.y, rect.width, EditorGUIUtility.singleLineHeight);
GUI.Label(_rect, "Entries");
}
}
}