2023-01-22 16:38:23 +01:00
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using UnityEngine;
|
|
|
|
|
|
|
|
|
|
namespace ABI.CCK.Components
|
|
|
|
|
{
|
2024-08-03 22:24:42 +02:00
|
|
|
|
[AddComponentMenu("ChilloutVR/CVR Face Tracking")]
|
|
|
|
|
[HelpURL("https://developers.abinteractive.net/cck/components/face-tracking/")]
|
|
|
|
|
public class CVRFaceTracking : MonoBehaviour, ICCK_Component
|
2023-01-22 16:38:23 +01:00
|
|
|
|
{
|
|
|
|
|
public bool UseFacialTracking = true;
|
|
|
|
|
public float BlendShapeStrength = 100f;
|
|
|
|
|
public SkinnedMeshRenderer FaceMesh;
|
|
|
|
|
public string[] FaceBlendShapes = new string[37];
|
|
|
|
|
|
|
|
|
|
public Mesh OriginalMesh = null;
|
|
|
|
|
[HideInInspector]
|
|
|
|
|
public List<string> BlendShapeNames = null;
|
|
|
|
|
[HideInInspector]
|
|
|
|
|
public static string[] FaceBlendShapeNames = new[] {"Jaw_Right", "Jaw_Left", "Jaw_Forward", "Jaw_Open",
|
|
|
|
|
"Mouth_Ape_Shape", "Mouth_Upper_Right", "Mouth_Upper_Left", "Mouth_Lower_Right", "Mouth_Lower_Left",
|
|
|
|
|
"Mouth_Upper_Overturn", "Mouth_Lower_Overturn", "Mouth_Pout", "Mouth_Smile_Right", "Mouth_Smile_Left",
|
|
|
|
|
"Mouth_Sad_Right", "Mouth_Sad_Left", "Cheek_Puff_Right", "Cheek_Puff_Left", "Cheek_Suck",
|
|
|
|
|
"Mouth_Upper_UpRight", "Mouth_Upper_UpLeft", "Mouth_Lower_DownRight", "Mouth_Lower_DownLeft",
|
|
|
|
|
"Mouth_Upper_Inside", "Mouth_Lower_Inside", "Mouth_Lower_Overlay", "Tongue_LongStep1", "Tongue_LongStep2",
|
|
|
|
|
"Tongue_Down", "Tongue_Up", "Tongue_Right", "Tongue_Left", "Tongue_Roll", "Tongue_UpLeft_Morph",
|
|
|
|
|
"Tongue_UpRight_Morph", "Tongue_DownLeft_Morph", "Tongue_DownRight_Morph"};
|
|
|
|
|
|
|
|
|
|
public bool enableOverdriveBlendShapes = false;
|
|
|
|
|
|
|
|
|
|
public void GetBlendShapeNames()
|
|
|
|
|
{
|
|
|
|
|
if (FaceMesh != null)
|
|
|
|
|
{
|
|
|
|
|
BlendShapeNames = new List<string>();
|
|
|
|
|
BlendShapeNames.Add("-none-");
|
|
|
|
|
for (int i = 0; i < FaceMesh.sharedMesh.blendShapeCount; ++i)
|
|
|
|
|
BlendShapeNames.Add(FaceMesh.sharedMesh.GetBlendShapeName(i));
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
BlendShapeNames = new List<string>();
|
|
|
|
|
BlendShapeNames.Add("-none-");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-08-03 22:24:42 +02:00
|
|
|
|
public void AutoSelectFaceTrackingShapes()
|
2023-01-22 16:38:23 +01:00
|
|
|
|
{
|
2024-08-03 22:24:42 +02:00
|
|
|
|
#if UNITY_EDITOR
|
|
|
|
|
UnityEditor.Undo.RecordObject(this, "CVR Auto Select Face Tracking");
|
|
|
|
|
#endif
|
2023-01-22 16:38:23 +01:00
|
|
|
|
for (int i = 0; i < FaceBlendShapeNames.Length; i++)
|
|
|
|
|
{
|
|
|
|
|
for (int j = 0; j < BlendShapeNames.Count; ++j)
|
|
|
|
|
{
|
|
|
|
|
if (BlendShapeNames[j].ToLower().Contains(FaceBlendShapeNames[i].ToLower()) ||
|
|
|
|
|
BlendShapeNames[j].ToLower().Contains(FaceBlendShapeNames[i].ToLower().Replace("_", "")))
|
|
|
|
|
{
|
|
|
|
|
FaceBlendShapes[i] = BlendShapeNames[j];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|