|
/************************************************************************************
|
|
Filename : OVRLipSyncContextMorphTargetEditor.cs
|
|
Content : This bridges the viseme output to the morph targets
|
|
Created : December 21st, 2018
|
|
Copyright : Copyright Facebook Technologies, LLC and its affiliates.
|
|
All rights reserved.
|
|
|
|
Licensed under the Oculus Audio SDK License Version 3.3 (the "License");
|
|
you may not use the Oculus Audio SDK except in compliance with the License,
|
|
which is provided at the time of installation or download, or which
|
|
otherwise accompanies this software in either electronic or hard copy form.
|
|
|
|
You may obtain a copy of the License at
|
|
|
|
https://developer.oculus.com/licenses/audio-3.3/
|
|
|
|
Unless required by applicable law or agreed to in writing, the Oculus Audio SDK
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
See the License for the specific language governing permissions and
|
|
limitations under the License.
|
|
************************************************************************************/
|
|
using UnityEngine;
|
|
using UnityEditor;
|
|
|
|
[CustomEditor(typeof(OVRLipSyncContextMorphTarget))]
|
|
public class OVRLipSyncContextMorphTargetEditor : Editor
|
|
{
|
|
SerializedProperty skinnedMeshRenderer;
|
|
SerializedProperty visemeToBlendTargets;
|
|
SerializedProperty visemeTestKeys;
|
|
SerializedProperty laughterKey;
|
|
SerializedProperty laughterBlendTarget;
|
|
SerializedProperty laughterThreshold;
|
|
SerializedProperty laughterMultiplier;
|
|
SerializedProperty smoothAmounth;
|
|
private static string[] visemeNames = new string[] {
|
|
"sil", "PP", "FF", "TH",
|
|
"DD", "kk", "CH", "SS",
|
|
"nn", "RR", "aa", "E",
|
|
"ih", "oh", "ou" };
|
|
void OnEnable()
|
|
{
|
|
skinnedMeshRenderer = serializedObject.FindProperty("skinnedMeshRenderer");
|
|
visemeToBlendTargets = serializedObject.FindProperty("visemeToBlendTargets");
|
|
visemeTestKeys = serializedObject.FindProperty("visemeTestKeys");
|
|
laughterKey = serializedObject.FindProperty("laughterKey");
|
|
laughterBlendTarget = serializedObject.FindProperty("laughterBlendTarget");
|
|
laughterThreshold = serializedObject.FindProperty("laughterThreshold");
|
|
laughterMultiplier = serializedObject.FindProperty("laughterMultiplier");
|
|
smoothAmounth = serializedObject.FindProperty("smoothAmount");
|
|
}
|
|
|
|
private void BlendNameProperty(SerializedProperty prop, string name, string[] blendNames = null)
|
|
{
|
|
if (blendNames == null)
|
|
{
|
|
EditorGUILayout.PropertyField(prop, new GUIContent(name));
|
|
return;
|
|
}
|
|
var values = new int[blendNames.Length + 1];
|
|
var options = new GUIContent[blendNames.Length + 1];
|
|
values[0] = -1;
|
|
options[0] = new GUIContent(" ");
|
|
for(int i = 0; i < blendNames.Length; ++i)
|
|
{
|
|
values[i + 1] = i;
|
|
options[i + 1] = new GUIContent(blendNames[i]);
|
|
}
|
|
EditorGUILayout.IntPopup(prop, options, values, new GUIContent(name));
|
|
}
|
|
|
|
private string[] GetMeshBlendNames()
|
|
{
|
|
var morphTarget = (OVRLipSyncContextMorphTarget)serializedObject.targetObject;
|
|
if (morphTarget == null || morphTarget.skinnedMeshRenderer == null)
|
|
{
|
|
return null;
|
|
}
|
|
var mesh = morphTarget.skinnedMeshRenderer.sharedMesh;
|
|
var blendshapeCount = mesh.blendShapeCount;
|
|
var blendNames = new string[blendshapeCount];
|
|
for(int i = 0; i < mesh.blendShapeCount; ++i)
|
|
{
|
|
blendNames[i] = mesh.GetBlendShapeName(i);
|
|
}
|
|
return blendNames;
|
|
}
|
|
public override void OnInspectorGUI()
|
|
{
|
|
var blendNames = GetMeshBlendNames();
|
|
var morphTarget = (OVRLipSyncContextMorphTarget)serializedObject.targetObject;
|
|
|
|
serializedObject.Update();
|
|
EditorGUILayout.PropertyField(skinnedMeshRenderer);
|
|
if (EditorGUILayout.PropertyField(visemeToBlendTargets))
|
|
{
|
|
EditorGUI.indentLevel++;
|
|
for(int i = 1; i < visemeNames.Length; ++i)
|
|
{
|
|
BlendNameProperty(visemeToBlendTargets.GetArrayElementAtIndex(i), visemeNames[i], blendNames);
|
|
}
|
|
BlendNameProperty(laughterBlendTarget, "Laughter", blendNames);
|
|
EditorGUI.indentLevel--;
|
|
}
|
|
if (morphTarget)
|
|
{
|
|
morphTarget.enableVisemeTestKeys = EditorGUILayout.ToggleLeft("Enable Viseme Test Keys", morphTarget.enableVisemeTestKeys);
|
|
}
|
|
if (EditorGUILayout.PropertyField(visemeTestKeys))
|
|
{
|
|
EditorGUI.indentLevel++;
|
|
for(int i = 1; i < visemeNames.Length; ++i)
|
|
{
|
|
EditorGUILayout.PropertyField(visemeTestKeys.GetArrayElementAtIndex(i), new GUIContent(visemeNames[i]));
|
|
}
|
|
EditorGUILayout.PropertyField(laughterKey, new GUIContent("Laughter"));
|
|
EditorGUI.indentLevel--;
|
|
}
|
|
EditorGUILayout.PropertyField(laughterThreshold);
|
|
EditorGUILayout.PropertyField(laughterMultiplier);
|
|
EditorGUILayout.PropertyField(smoothAmounth);
|
|
serializedObject.ApplyModifiedProperties();
|
|
}
|
|
}
|