예제 #1
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]);
        }
예제 #2
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);
        }