Files
VIVE-OpenXR-Unity/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/Lip/LipShapeTableDrawer.cs
2023-06-15 10:10:25 +08:00

73 lines
3.7 KiB
C#

//========= Copyright 2019, HTC Corporation. All rights reserved. ===========
#if UNITY_EDITOR
using UnityEngine;
using UnityEditor;
using System;
namespace VIVE
{
namespace FacialTracking.Sample
{
[CustomPropertyDrawer(typeof(LipShapeTable))]
public class LipShapeTableDrawer : PropertyDrawer
{
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
{
EditorGUI.BeginProperty(position, label, property);
Rect newFieldPosition = EditorGUI.PrefixLabel(position, GUIUtility.GetControlID(FocusType.Passive), label);
newFieldPosition.height = EditorGUIUtility.singleLineHeight;
Rect newLabelPosition = position;
newLabelPosition.width -= newFieldPosition.width;
newLabelPosition.height = newFieldPosition.height;
SerializedProperty propSkinedMesh = property.FindPropertyRelative("skinnedMeshRenderer");
SerializedProperty propLipShapes = property.FindPropertyRelative("lipShapes");
EditorGUI.PropertyField(newFieldPosition, propSkinedMesh, GUIContent.none);
newFieldPosition.y += EditorGUIUtility.singleLineHeight;
SkinnedMeshRenderer skinnedMesh = propSkinedMesh.objectReferenceValue as SkinnedMeshRenderer;
if (skinnedMesh != null && skinnedMesh.sharedMesh.blendShapeCount > 0)
{
if (propLipShapes.arraySize != skinnedMesh.sharedMesh.blendShapeCount)
{
propLipShapes.arraySize = skinnedMesh.sharedMesh.blendShapeCount;
for (int i = 0; i < skinnedMesh.sharedMesh.blendShapeCount; ++i)
{
SerializedProperty propLipShape = propLipShapes.GetArrayElementAtIndex(i);
string elementName = skinnedMesh.sharedMesh.GetBlendShapeName(i);
propLipShape.intValue = (int)XrLipShapeHTC.XR_LIP_SHAPE_NONE_HTC;
foreach (XrLipShapeHTC lipShape in (XrLipShapeHTC[])Enum.GetValues(typeof(XrLipShapeHTC)))
{
if (elementName == lipShape.ToString())
propLipShape.intValue = (int)lipShape;
}
}
}
for (int i = 0; i < skinnedMesh.sharedMesh.blendShapeCount; ++i)
{
SerializedProperty propLipShape = propLipShapes.GetArrayElementAtIndex(i);
newLabelPosition.y = newFieldPosition.y;
string elementName = skinnedMesh.sharedMesh.GetBlendShapeName(i);
EditorGUI.LabelField(newLabelPosition, " " + elementName);
EditorGUI.PropertyField(newFieldPosition, propLipShape, GUIContent.none);
newFieldPosition.y += EditorGUIUtility.singleLineHeight;
}
}
EditorGUI.EndProperty();
}
public override float GetPropertyHeight(SerializedProperty property, GUIContent label)
{
int LineCount = 1;
SerializedProperty propSkinedMesh = property.FindPropertyRelative("skinnedMeshRenderer");
SkinnedMeshRenderer skinnedMesh = propSkinedMesh.objectReferenceValue as SkinnedMeshRenderer;
if (skinnedMesh != null) LineCount += skinnedMesh.sharedMesh.blendShapeCount;
return EditorGUIUtility.singleLineHeight * LineCount;
}
}
}
}
#endif