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