using UnityEngine; using System.Collections; using System.Collections.Generic; using System.Linq; public class TableCurve : Curve { private readonly List _args; private readonly List _vals; public float[] Args{ get{return _args.ToArray();} } public float[] Vals{ get{return _vals.ToArray();} } public TableCurve(){ _args = new List(); _vals = new List(); } public TableCurve(IList args, IList vals){ if((args == null) || (vals == null)){ _args = new List(); _vals = new List(); return; } _args = args.ToList(); _vals = vals.ToList(); } public void AddArg(float arg){ _args.Add(arg); } public void AddVal(float val){ _vals.Add(val); } public override float Sample(float arg) { arg = Mathf.Clamp(arg, _args[0], _args[_args.Count - 1]); for (int i = 0; i < (_args.Count - 1); ++i) { if (_args[i] == arg) { return _vals[i]; } var a = _args[i]; var b = _args[i + 1]; //args decreasing if (b < a) { if (arg < a && arg > b) { return Mathf.Lerp(_vals[i], _vals[i + 1], (arg - a) / (b - a)); } } else { if (arg > a && arg < b) { return Mathf.Lerp(_vals[i], _vals[i + 1], (arg - a) / (b - a)); } } } return float.NaN; } }