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]); }
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); }