You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
196 lines
7.3 KiB
C#
196 lines
7.3 KiB
C#
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
using SiegeSong;
|
|
|
|
namespace SiegeSong {
|
|
public class LipSyncKeyframe
|
|
{
|
|
public string FaceShapeKey { get; set; }
|
|
|
|
public int ApplyPercentage { get; set; }
|
|
|
|
public int FadeInDuration { get; set; }
|
|
|
|
public int MaintainDuration { get; set; }
|
|
|
|
public int FadeOutDuration { get; set; }
|
|
}
|
|
|
|
public class LipSync : MonoBehaviour
|
|
{
|
|
//"Male_phoneme_FV"
|
|
//"Male_phoneme_PBM"
|
|
//"Male_phoneme_ShCh"
|
|
//"Male_phoneme_W"
|
|
//"Male_phoneme_Wide"
|
|
//"Male_TongueBack"
|
|
//"Male_TongueRoof"
|
|
//"Male_TongueTeeth"
|
|
//"RaisedBrows"
|
|
//"SmileLeft"
|
|
//"SmileRight"
|
|
//"Snarl"
|
|
//"AngryBrows"
|
|
//"Sniff"
|
|
//"MouthWidth"
|
|
|
|
|
|
public LipSyncKeyframe[] Keyframes;
|
|
public int CurrentKeyframeIndex;
|
|
public float CurrentKeyframeStartTimestamp;
|
|
|
|
public Dictionary<string, Dictionary<string, float>> FaceShapes ()
|
|
{
|
|
var faceShapes = new Dictionary<string, Dictionary<string, float>>();
|
|
|
|
var faceShape_AIU = new Dictionary<string, float>();
|
|
faceShape_AIU.Add("Snarl", 0.078f);
|
|
faceShape_AIU.Add("Male_phoneme_Wide", 0.514f);
|
|
faceShape_AIU.Add("Male_phoneme_W", 0.486f);
|
|
faceShape_AIU.Add("Male_phoneme_ShCh", 0.114f);
|
|
faceShape_AIU.Add("Male_phoneme_PBM", 0.294f);
|
|
faceShape_AIU.Add("Male_phoneme_FV", 0.176f);
|
|
faceShapes.Add("AIU", faceShape_AIU);
|
|
|
|
var faceShape_O = new Dictionary<string, float>();
|
|
faceShape_O.Add("Snarl", 0.124f);
|
|
faceShape_O.Add("Male_phoneme_Wide", 0.094f);
|
|
faceShape_O.Add("Male_phoneme_W", 0.953f);
|
|
faceShape_O.Add("Male_phoneme_ShCh", 0.114f);
|
|
faceShape_O.Add("Male_phoneme_PBM", 0.176f);
|
|
faceShape_O.Add("Male_phoneme_FV", 0.0f);
|
|
faceShapes.Add("O", faceShape_O);
|
|
|
|
var faceShape_E = new Dictionary<string, float>();
|
|
faceShape_E.Add("Snarl", 0.223f);
|
|
faceShape_E.Add("Male_phoneme_Wide", 0.596f);
|
|
faceShape_E.Add("Male_phoneme_W", 0.486f);
|
|
faceShape_E.Add("Male_phoneme_ShCh", 0.114f);
|
|
faceShape_E.Add("Male_phoneme_PBM", 0.294f);
|
|
faceShape_E.Add("Male_phoneme_FV", 0.176f);
|
|
faceShape_E.Add("Male_TongueTeeth", 0.0f);
|
|
faceShapes.Add("E", faceShape_E);
|
|
|
|
var faceShape_CKGJRSXYZ = new Dictionary<string, float>();
|
|
faceShape_CKGJRSXYZ.Add("Snarl", 0.227f);
|
|
faceShape_CKGJRSXYZ.Add("Male_phoneme_Wide", 0.231f);
|
|
faceShape_CKGJRSXYZ.Add("Male_phoneme_W", 0.314f);
|
|
faceShape_CKGJRSXYZ.Add("Male_phoneme_ShCh", 0.0f);
|
|
faceShape_CKGJRSXYZ.Add("Male_phoneme_PBM", 0.176f);
|
|
faceShape_CKGJRSXYZ.Add("Male_phoneme_FV", 0.0f);
|
|
faceShape_CKGJRSXYZ.Add("Male_TongueTeeth", 0.0f);
|
|
faceShapes.Add("CKGJRSXYZ", faceShape_CKGJRSXYZ);
|
|
|
|
var faceShape_DLNTH = new Dictionary<string, float>();
|
|
faceShape_DLNTH.Add("Snarl", 0.102f);
|
|
faceShape_DLNTH.Add("Male_phoneme_Wide", 0.267f);
|
|
faceShape_DLNTH.Add("Male_phoneme_W", 0.855f);
|
|
faceShape_DLNTH.Add("Male_phoneme_ShCh", 0.125f);
|
|
faceShape_DLNTH.Add("Male_phoneme_PBM", 0.322f);
|
|
faceShape_DLNTH.Add("Male_phoneme_FV", 0.063f);
|
|
faceShape_DLNTH.Add("Male_TongueTeeth", 0.813f);
|
|
faceShapes.Add("DLNTH", faceShape_DLNTH);
|
|
|
|
var faceShape_WQOO = new Dictionary<string, float>();
|
|
faceShape_WQOO.Add("Snarl", 0.03f);
|
|
faceShape_WQOO.Add("Male_phoneme_Wide", 0.094f);
|
|
faceShape_WQOO.Add("Male_phoneme_W", 0.953f);
|
|
faceShape_WQOO.Add("Male_phoneme_ShCh", 0.114f);
|
|
faceShape_WQOO.Add("Male_phoneme_PBM", 0.176f);
|
|
faceShape_WQOO.Add("Male_phoneme_FV", 0.0f);
|
|
faceShape_WQOO.Add("Male_TongueTeeth", 0.0f);
|
|
faceShapes.Add("WQOO", faceShape_WQOO);
|
|
|
|
var faceShape_MBP = new Dictionary<string, float>();
|
|
faceShape_MBP.Add("Snarl", 0.0f);
|
|
faceShape_MBP.Add("Male_phoneme_Wide", 0.0f);
|
|
faceShape_MBP.Add("Male_phoneme_W", 0.0f);
|
|
faceShape_MBP.Add("Male_phoneme_ShCh", 0.0f);
|
|
faceShape_MBP.Add("Male_phoneme_PBM", 0.0f);
|
|
faceShape_MBP.Add("Male_phoneme_FV", 0.0f);
|
|
faceShape_MBP.Add("Male_TongueTeeth", 0.0f);
|
|
faceShapes.Add("MBP", faceShape_MBP);
|
|
|
|
var faceShape_FV = new Dictionary<string, float>();
|
|
faceShape_FV.Add("Snarl", 0.0f);
|
|
faceShape_FV.Add("Male_phoneme_Wide", 0.0f);
|
|
faceShape_FV.Add("Male_phoneme_W", 0.0f);
|
|
faceShape_FV.Add("Male_phoneme_ShCh", 0.0f);
|
|
faceShape_FV.Add("Male_phoneme_PBM", 0.0f);
|
|
faceShape_FV.Add("Male_phoneme_FV", 0.855f);
|
|
faceShape_FV.Add("Male_TongueTeeth", 0.0f);
|
|
faceShapes.Add("FV", faceShape_FV);
|
|
|
|
return faceShapes;
|
|
}
|
|
|
|
|
|
public void PlayCurrentKeyframe ()
|
|
{
|
|
var currentTimeStamp = Time.deltaTime;
|
|
var startStamp = CurrentKeyframeStartTimestamp;
|
|
var keyFrame = Keyframes[CurrentKeyframeIndex];
|
|
var progress = currentTimeStamp - startStamp; // how many milliseconds since the transition started
|
|
var interpolationRatio = 1.0f;
|
|
if (progress < keyFrame.FadeInDuration)
|
|
{
|
|
// fading in
|
|
interpolationRatio = progress / keyFrame.FadeInDuration;
|
|
}
|
|
if (progress > keyFrame.FadeInDuration + keyFrame.MaintainDuration &&
|
|
progress < keyFrame.FadeInDuration + keyFrame.MaintainDuration + keyFrame.FadeOutDuration)
|
|
{
|
|
// fading out
|
|
interpolationRatio = keyFrame.FadeOutDuration / progress;
|
|
}
|
|
if (progress < keyFrame.FadeInDuration + keyFrame.MaintainDuration + keyFrame.FadeOutDuration)
|
|
{
|
|
CurrentKeyframeIndex++;
|
|
if (CurrentKeyframeIndex == Keyframes.Length)
|
|
{
|
|
CurrentKeyframeIndex = 0;
|
|
}
|
|
ResetCurrentKeyframeStartTimestamp();
|
|
}
|
|
SetFaceShape(keyFrame.FaceShapeKey, interpolationRatio);
|
|
}
|
|
|
|
public void ResetCurrentKeyframeStartTimestamp()
|
|
{
|
|
CurrentKeyframeStartTimestamp = Time.deltaTime;
|
|
}
|
|
|
|
public void SetFaceShape(string shapeKey, float interpolationRatio)
|
|
{
|
|
var faceShapes = FaceShapes();
|
|
foreach (var shapeBlendKey in faceShapes[shapeKey].Keys)
|
|
{
|
|
var oldValue = GetCurrentBlendShapeValue(shapeBlendKey);
|
|
var newValue = faceShapes[shapeKey][shapeBlendKey] * interpolationRatio;
|
|
SetBlendShapeValue(shapeBlendKey, (oldValue + newValue) / 2);
|
|
}
|
|
}
|
|
|
|
public void SetBlendShapeValue(string blendkey, float value)
|
|
{
|
|
|
|
}
|
|
|
|
public float GetCurrentBlendShapeValue(string blendkey)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
void Start()
|
|
{
|
|
|
|
}
|
|
|
|
void Update()
|
|
{
|
|
PlayCurrentKeyframe();
|
|
}
|
|
}
|
|
}
|