/// <summary> /// Set Goron energy colors from the given options. /// </summary> /// <param name="options">Color options.</param> void SetGoronEnergyColors(GoronColorOptions options) { Colors.GoronPunchEnergyPrim = GetPunchPrim(options.Main); Colors.GoronPunchEnergyEnv1 = options.Extra1; Colors.GoronPunchEnergyEnv2 = options.Extra1; var inner = Mix(options.Main, Colors.GoronRollInnerEnergyEnv); Colors.GoronRollInnerEnergyEnv = inner.Item1; Colors.GoronRollInnerEnergyPrim = inner.Item2; var outer1 = Mix(options.Extra1, Colors.GoronRollOuterEnergyEnv1); Colors.GoronRollOuterEnergyEnv1 = outer1.Item1; Colors.GoronRollOuterEnergyPrim1 = outer1.Item2; var outer2 = Mix(options.Extra2, Colors.GoronRollOuterEnergyEnv2); Colors.GoronRollOuterEnergyEnv2 = outer2.Item1; Colors.GoronRollOuterEnergyPrim2 = outer2.Item2; Color GetPunchPrim(Color color) { var converter = new ColorSpaceConverter(); return(converter.TranslateHsv(color, hsv => new Hsv(hsv.H, (hsv.S / 5f) * 4f, hsv.V))); } (Color env, Color prim) Mix(Color color, Color env) { // Convert color values to HSV. var converter = new ColorSpaceConverter(); var curHsv = converter.ToHsv(color); var envHsv = converter.ToHsv(env); // Calculate delta of Value. var envHsvValDelta = ((curHsv.V + envHsv.V) / 2f) - curHsv.V; // Multiply by Saturation to limit deviation of Value for greyscale-approaching colors (Saturation approaching 0). var envHsvValue = options.MixEnvValue ? curHsv.V + (envHsvValDelta * curHsv.S) : curHsv.V; // Build new colors from HSV. var envResultHsv = new Hsv(curHsv.H, curHsv.S, envHsvValue); var primResultHsv = new Hsv(curHsv.H, curHsv.S, curHsv.V); // Convert back into RGB. var envResult = converter.ToColor(envResultHsv); var primResult = converter.ToColor(primResultHsv); return(envResult, primResult); } }