Exemplo n.º 1
0
        public Animation Linear <T>(
            FieldGetFn <T> getter,
            FieldSetFn <T> setter,
            LerpFn <T> lerp,
            T dest,
            float velocity,
            Animation.Callback callback = null)
        {
            T     origin = getter.Invoke();
            float t      = 0;

            return(new Animation(
                       () =>
            {
                origin = getter.Invoke();
                t = 0f;
                return null;
            },
                       (object state, float dt) =>
            {
                t += dt * velocity;
                setter.Invoke(lerp.Invoke(origin, dest, t));
                return state;
            },
                       (object state) => t >= 1,
                       (object state) =>
            {
                if (callback != null)
                {
                    callback.Invoke(null);
                }
            }));
        }
Exemplo n.º 2
0
 public Animation Lerp <T>(
     FieldGetFn <T> getter,
     FieldSetFn <T> setter,
     LerpFn <T> lerp,
     Comparator <T> magnitude,
     T dest,
     float velocity,
     Animation.Callback callback = null)
 {
     return(new Animation(
                () => null,
                (object state, float t) =>
     {
         setter.Invoke(lerp.Invoke(getter.Invoke(), dest, velocity * t));
         return state;
     },
                (object state) => (magnitude.Invoke(getter.Invoke(), dest) < epsilon),
                (object state) =>
     {
         setter.Invoke(dest);
         if (callback != null)
         {
             callback.Invoke(state);
         }
     }
                ));
 }
Exemplo n.º 3
0
 public static T GetValueAtDistance <T>(float distance, ValueAtDistance <T>[] values, LerpFn <T> lerp)
     where T : struct
 => GetValueAtDistance(distance, values, lerp, values[0].Value, values[values.Length - 1].Value);
Exemplo n.º 4
0
        public static T GetValueAtDistance <T>(float distance, ValueAtDistance <T>[] values, LerpFn <T> lerp, T defMin, T defMax)
            where T : struct
        {
            if (distance <= values[0].Distance)
            {
                return(defMin);
            }
            else if (distance >= values[values.Length - 1].Distance)
            {
                return(defMax);
            }
            else
            {
                for (int i = 1; i < values.Length; ++i)
                {
                    if (values[i].Distance > distance)
                    {
                        return(LerpValueAtDistance(distance, values[i - 1], values[i], lerp));
                    }
                }
            }

            return(defMax);
        }
Exemplo n.º 5
0
        public static T LerpValueAtDistance <T>(float distance, ValueAtDistance <T> a, ValueAtDistance <T> b, LerpFn <T> lerp)
            where T : struct
        {
            float max = b.Distance - a.Distance;

            if (max > 0)
            {
                float t = (distance - a.Distance) / max;
                if (t > 0 && t < 1)
                {
                    return(lerp(a.Value, b.Value, t));
                }
                else
                {
                    return(t <= 0 ? a.Value : b.Value);
                }
            }
            return(a.Value);
        }