| 25 | } |
| 26 | |
| 27 | FLinearColor HSVToRGB(float H, float S, float V) |
| 28 | { |
| 29 | // Standard HSV -> RGB (matches MuJoCo's hsv2rgb). |
| 30 | H = FMath::Fmod(H, 1.0f); |
| 31 | if (H < 0.0f) |
| 32 | H += 1.0f; |
| 33 | const float C = V * S; |
| 34 | const float Hp = H * 6.0f; |
| 35 | const float X = C * (1.0f - FMath::Abs(FMath::Fmod(Hp, 2.0f) - 1.0f)); |
| 36 | float R = 0, G = 0, B = 0; |
| 37 | if (Hp < 1) |
| 38 | { |
| 39 | R = C; |
| 40 | G = X; |
| 41 | } |
| 42 | else if (Hp < 2) |
| 43 | { |
| 44 | R = X; |
| 45 | G = C; |
| 46 | } |
| 47 | else if (Hp < 3) |
| 48 | { |
| 49 | G = C; |
| 50 | B = X; |
| 51 | } |
| 52 | else if (Hp < 4) |
| 53 | { |
| 54 | G = X; |
| 55 | B = C; |
| 56 | } |
| 57 | else if (Hp < 5) |
| 58 | { |
| 59 | R = X; |
| 60 | B = C; |
| 61 | } |
| 62 | else |
| 63 | { |
| 64 | R = C; |
| 65 | B = X; |
| 66 | } |
| 67 | const float M = V - C; |
| 68 | return FLinearColor(R + M, G + M, B + M, 1.0f); |
| 69 | } |
| 70 | |
| 71 | FLinearColor ApplySleepModulation(const FLinearColor& InColor, float SleepValueScale, float SleepSaturationScale) |
| 72 | { |
no outgoing calls