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#

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();
}
}
}