123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212 |
- using System.Collections.Generic;
- using UnityEngine;
- namespace CombatLibrary.CombatLibrary.CombatCore.Utility
- {
- public struct ACurve
- {
- public List<CurveInfo> CurveInfos;
- public CurveType CurveType;
- public ACurve(CurveInfo[] curveInfos)
- {
- CurveInfos = new List<CurveInfo>();
- CurveInfos.AddRange(curveInfos);
- CurveType = CurveType.HYT;
- }
- public float Evaluate(float t)
- {
- if (CurveInfos == null)
- {
- return t;
- }
- if (CurveInfos.Count < 2)
- {
- return t;
- }
- switch (CurveType)
- {
- case CurveType.HYT:
- return HYT(t);
- break;
- case CurveType.BSL:
- return BSL(t);
- break;
- }
- return 0;
- }
- public Vector2 EvaluateForVector2(float t,float currTime)
- {
- if (CurveInfos == null)
- {
- return new Vector2();
- }
- if (CurveInfos.Count < 2)
- {
- return new Vector2();
- }
- switch (CurveType)
- {
- // case CurveType.HYT:
- // // return HYT(t);
- // break;
- case CurveType.BSL:
- return BSLForVector2(t, currTime);
- break;
- }
- return new Vector2();
- }
- private Vector2 BSLForVector2(float t,float currTime)
- {
- CurveInfo c1 = default;
- CurveInfo c2 = default;
- for (int i = 0; i < CurveInfos.Count; i++)
- {
- if (CurveInfos[i].BSLt > currTime)
- {
- int lindex = i - 1;
- if (lindex < 0)
- {
- CurveInfo endInfo = CurveInfos[i];
- Vector2 endPos = new Vector2((float)endInfo.t, (float)endInfo.v);
- return endPos;
- }
- c1 = CurveInfos[i - 1];
- c2 = CurveInfos[i];
- break;
- }
- }
- if (c2.t==0)
- {
- CurveInfo endInfo = CurveInfos[^1];
- Vector2 endPos = new Vector2(endInfo.t, endInfo.v);
- return endPos;
- }
- Vector2 pos1 = new Vector2((float)c1.t, (float)c1.v);
- Vector2 pos2 = new Vector2((float)c1.it, (float)c1.ot);
- Vector2 pos4 = new Vector2((float)c2.t, (float)c2.v);
- Vector2 pos3 = new Vector2((float)c2.it, (float)c2.ot);
- // float v11 = (float) c1.t;
- // float v12 = (float) c1.v;
- // float t11 = (float) c1.it;
- // float t12 = (float) c1.ot;
- //
- // float v21 = (float) c2.t;
- // float v22 = (float) c2.v;
- // float t21 = (float) c2.it;
- // float t22 = (float) c2.ot;
- Vector2 a = Vector2.Lerp(pos1, pos2, t);
- Vector2 b = Vector2.Lerp(pos2, pos3, t);
- Vector2 c = Vector2.Lerp(pos3, pos4, t);
- Vector2 d = Vector2.Lerp(a, b, t);
- Vector2 e = Vector2.Lerp(b, c, t);
- Vector2 f = Vector2.Lerp(d, e, t);
- return f;
- }
- private float BSL(float t)
- {
- CurveInfo c1 = default;
- CurveInfo c2 = default;
- for (int i = 0; i < CurveInfos.Count; i++)
- {
- if (CurveInfos[i].t > t)
- {
- int lindex = i - 1;
- if (lindex < 0)
- {
- return (float)CurveInfos[i].v;
- }
- c1 = CurveInfos[i - 1];
- c2 = CurveInfos[i];
- break;
- }
- }
- if (c2.t == 0)
- {
- return (float)CurveInfos[^1].v;
- }
- Vector2 pos1 = new Vector2((float)c1.t, (float)c1.v);
- Vector2 pos2 = new Vector2((float)c1.it, (float)c1.ot);
- Vector2 pos4 = new Vector2((float)c2.t, (float)c2.v);
- Vector2 pos3 = new Vector2((float)c2.it, (float)c2.ot);
- // float v11 = (float) c1.t;
- // float v12 = (float) c1.v;
- // float t11 = (float) c1.it;
- // float t12 = (float) c1.ot;
- //
- // float v21 = (float) c2.t;
- // float v22 = (float) c2.v;
- // float t21 = (float) c2.it;
- // float t22 = (float) c2.ot;
- Vector2 a = Vector2.Lerp(pos1, pos2, t);
- Vector2 b = Vector2.Lerp(pos2, pos3, t);
- Vector2 c = Vector2.Lerp(pos3, pos4, t);
- Vector2 d = Vector2.Lerp(a, b, t);
- Vector2 e = Vector2.Lerp(b, c, t);
- Vector2 f = Vector2.Lerp(d, e, t);
- return f.y;
- }
- private float HYT(float t)
- {
- CurveInfo c1 = default;
- CurveInfo c2 = default;
- for (int i = 0; i < CurveInfos.Count; i++)
- {
- if (CurveInfos[i].t > t)
- {
- int lindex = i - 1;
- if (lindex < 0)
- {
- return (float)CurveInfos[i].v;
- }
- c1 = CurveInfos[i - 1];
- c2 = CurveInfos[i];
- break;
- }
- }
- if (c2.t == 0)
- {
- return (float)CurveInfos[^1].v;
- }
- float ct = (float)c2.t - c1.t;
- t = (t - c1.t) / ct;
- float ot = c1.ot * ct;
- float it = c2.it * ct;
- float t2 = t * t;
- float t3 = t2 * t;
- float a = (2 * t3 - 3 * t2 + 1);
- float b = t3 - 2 * t2 + t;
- float c = t3 - t2;
- float d = -2 * t3 + 3 * t2;
- return a * c1.v + b * ot + c * it + d * c2.v;
- }
- }
- }
|