예제 #1
0
        private float ParseFunctionTypeMax(TagFunctionType type, float input, float scale, int index)
        {
            float result = 0.0f;

            switch (type)
            {
            case TagFunctionType.Identity:
                result = input;
                break;

            case TagFunctionType.Constant:
                result = scale;
                break;

            case TagFunctionType.Transition:
                result = Transition(index + 44, input);
                break;

            case TagFunctionType.Spline:
                result = ComputePolynomial(3, GetCoefficients(48, 3), input);
                break;

            case TagFunctionType.Periodic:
                result = 0.0f;
                break;

            case TagFunctionType.Linear:
                result = ComputePolynomial(1, GetCoefficients(40, 1), input);
                break;

            case TagFunctionType.LinearKey:
                result = LinearKey(index + 112, input);
                break;

            case TagFunctionType.Exponent:
                result = Exponent(index + 44, 0, input);     //Has a particular value for exponent, more reversing required
                break;

            default:
                break;
            }
            return(result);
        }
예제 #2
0
        public float ComputeFunction(float input, float scale)
        {
            if (Data == null || Data.Length <= 0)
            {
                return(0.0f);
            }

            TagFunctionType  opcode = (TagFunctionType)Data[0];
            TagFunctionFlags flags  = (TagFunctionFlags)Data[1];

            float result = ComputeSubFunction(0, input, scale);

            if (Data[2] >= 1)
            {
                return(result);
            }

            // Weird
            return((Data[2] - Data[1]) * result + Data[1]);
        }
예제 #3
0
        private float ComputeSubFunction(int index, float input, float scale)
        {
            float result = 0.0f;
            float min    = 0.0f;
            float max    = 0.0f;

            TagFunctionType  opcode = (TagFunctionType)Data[index];
            TagFunctionFlags flags  = (TagFunctionFlags)Data[index + 1];

            min = ParseFunctionTypeMin(opcode, input, scale, index);

            if (flags.HasFlag(TagFunctionFlags.HasRange))
            {
                max = ParseFunctionTypeMax(opcode, input, scale, index);

                if (opcode == TagFunctionType.Constant)
                {
                    result = max;
                }
                else
                {
                    result = ScaleOutput(min, max, scale);
                }
            }
            else
            {
                result = min;
            }

            if (flags.HasFlag(TagFunctionFlags.IsBounded))
            {
                result = FitToBounds(0, 1, result);
            }

            return(result);
        }