// Magica Cloth. // Copyright (c) MagicaSoft, 2020-2022. // https://magicasoft.jp using Unity.Mathematics; namespace MagicaCloth { /// /// 2次ベジェ曲線データ /// public struct CurveParam { public float sval; public float eval; public float cval; public int useCurve; public CurveParam(float value) { // 線形 useCurve = 0; sval = value; eval = value; cval = 0; } public CurveParam(float svalue, float evalue) { // 線形 useCurve = 0; sval = svalue; eval = evalue; cval = 0; } public CurveParam(BezierParam bezier) { useCurve = 0; sval = 0; eval = 0; cval = 0; Setup(bezier); } /// /// ベジェ曲線のデータを格納 /// /// public void Setup(BezierParam bezier) { useCurve = bezier.UseCurve ? 1 : 0; sval = bezier.StartValue; eval = bezier.EndValue; // 制御点を事前計算しておく cval = math.lerp(eval, sval, math.saturate(bezier.CurveValue * 0.5f + 0.5f)); } /// /// データを取得する /// /// 横軸(0.0-1.0) /// public float Evaluate(float t) { t = math.saturate(t); if (useCurve == 1) { // 2次ベジェ曲線 float w = 1.0f - t; return (w * w * sval + 2 * w * t * cval + t * t * eval); } else { // 線形 return math.lerp(sval, eval, t); } } } }