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.

165 lines
5.3 KiB
C#

4 years ago
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
namespace InfinityPBR
{
[RequireComponent(typeof(BlendShapesManager))]
[System.Serializable]
public class BlendShapesPresetManager : MonoBehaviour
{
public List<BlendShapePreset> presets = new List<BlendShapePreset>();
[HideInInspector] public string[] onTriggerMode = new[] {"Explicit", "Random"};
[HideInInspector] public List<Shape> shapeList = new List<Shape>();
[HideInInspector] public string[] shapeListNames;
[HideInInspector] public int shapeListIndex = 0;
[HideInInspector] public bool showHelpBoxes = true;
[HideInInspector] public bool showFullInspector = false;
[HideInInspector] public bool showSetup = true;
[HideInInspector] public bool lerp = true;
[HideInInspector] public float lerpSeconds = 2;
private float _lerpValue;
private float _lerpTime;
private bool _isLerping;
public BlendShapesManager BlendShapesManager => GetBlendShapesManager();
private BlendShapesManager _blendShapesManager;
private BlendShapesManager GetBlendShapesManager()
{
if (_blendShapesManager != null) return _blendShapesManager;
if (TryGetComponent(out BlendShapesManager foundManager))
_blendShapesManager = foundManager;
return _blendShapesManager;
}
public void StartTransitionToPreset(BlendShapePreset preset)
{
Debug.Log($"Start Transition to Preset {preset.name}");
SetToAndFromValues(preset); // save the current value and the "to" value on this preset
_lerpValue = 0f; // reset this
_lerpTime = 0f; // reset this
_isLerping = true; // set this on
StartCoroutine(nameof(LerpToPreset)); // Start the coroutine
}
public void StartTransitionToPreset(int presetIndex)
{
if (presetIndex < 0 || presets.Count <= presetIndex)
{
Debug.LogError($"Index {presetIndex} is out of range");
return;
}
StartTransitionToPreset(presets[presetIndex]);
}
public void StartTransitionToPreset(string presetName)
{
var foundPreset = presets.FirstOrDefault(x => x.name == presetName);
if (foundPreset == null)
{
Debug.LogError($"No preset found named {presetName}");
return;
}
StartTransitionToPreset(foundPreset);
}
IEnumerator LerpToPreset()
{
while (_isLerping)
{
_lerpTime += Time.deltaTime / lerpSeconds;
_lerpValue = Mathf.Lerp(0, 1, _lerpTime);
BlendShapesManager.LerpToValue(_lerpValue);
if (_lerpValue >= 1)
break;
yield return null;
}
}
public void ValueBetweenTwoPresets(float value, BlendShapePreset from, BlendShapePreset to)
{
}
/// <summary>
/// Activates an individual preset
/// </summary>
/// <param name="index"></param>
public void ActivatePreset(int index)
{
for (int v = 0; v < presets[index].presetValues.Count; v++)
{
BlendShapePresetValue presetValue = presets[index].presetValues[v];
BlendShapeGameObject obj = BlendShapesManager.GetBlendShapeObject(presetValue.objectName);
BlendShapeValue value = BlendShapesManager.GetBlendShapeValue(obj, presetValue.valueTriggerName);
value.value = presetValue.onTriggerMode == "Explicit"
? presetValue.shapeValue
: Random.Range(presetValue.limitMin, presetValue.limitMax);
BlendShapesManager.TriggerShape(obj,value);
}
}
public void SetToAndFromValues(BlendShapePreset preset)
{
BlendShapesManager.SetToAndFromValues(preset);
}
/// <summary>
/// Activates an individual named preset
/// </summary>
/// <param name="name"></param>
public void ActivatePreset(string name)
{
for (int i = 0; i < presets.Count; i++)
{
if (presets[i].name != name)
continue;
ActivatePreset(i);
return;
}
}
}
[System.Serializable]
public class BlendShapePreset
{
public string name;
public List<BlendShapePresetValue> presetValues = new List<BlendShapePresetValue>();
[HideInInspector] public bool showValues = false;
}
[System.Serializable]
public class BlendShapePresetValue
{
public string objectName;
public string valueTriggerName;
public string onTriggerMode;
[HideInInspector] public int onTriggerModeIndex = 0;
public float shapeValue;
public float limitMin;
public float limitMax;
public float min;
public float max;
}
[System.Serializable]
public class Shape
{
public BlendShapeGameObject obj;
public BlendShapeValue value;
}
}