Ejemplo n.º 1
0
    public void Execute(int index)
    {
        if (Keys.Length == 0)
        {
            Value[index] = 0;
            return;
        }
        int prevIndex = CachedKeysIndices[index + firstIndex - 1];

        if (prevIndex == -1)
        {
            Value[index] = Keys[0].value;
            return;
        }
        if (prevIndex == Keys.Length - 1)
        {
            Value[index] = Keys[Keys.Length - 1].value;
            return;
        }

        keyStruct prevKey = Keys[prevIndex];

        switch (prevKey.interpolation)
        {
        case Interpolation.Constant:
            Value[index] = prevKey.value;
            break;

        case Interpolation.Linear:
            keyStruct nextKey    = Keys[prevIndex + 1];
            float     dt         = (index - prevKey.frame) / (float)(nextKey.frame - prevKey.frame);
            float     oneMinusDt = 1f - dt;
            Value[index] = prevKey.value * oneMinusDt + nextKey.value * dt;
            break;

        case Interpolation.Bezier:
            keyStruct nextKey1 = Keys[prevIndex + 1];
            Vector2   A        = new Vector2(prevKey.frame, prevKey.value);
            Vector2   D        = new Vector2(nextKey1.frame, nextKey1.value);

            Vector2 B = A + prevKey.outTangent;
            Vector2 C = D - nextKey1.inTangent;
            Value[index] = Bezier.EvaluateBezier(A, B, C, D, index + firstIndex);

            break;
        }
    }