/// <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); } }
/// <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;
/// <summary> /// Apply energy colors for a specific <see cref="TransformationForm"/>. /// </summary> /// <param name="form">Transformation form.</param> /// <param name="colors">Energy colors to apply.</param> void ApplyEnergyColors(TransformationForm form, Color[] colors) { if (form == TransformationForm.Human) { SetHumanEnergyColors(colors[0], colors[1]); } else if (form == TransformationForm.Deku) { SetDekuEnergyColors(colors[0]); } else if (form == TransformationForm.Goron) { var options = new GoronColorOptions(colors[0], colors[1], colors[2]); SetGoronEnergyColors(options); } else if (form == TransformationForm.Zora) { SetZoraEnergyColors(colors[0]); } else if (form == TransformationForm.FierceDeity) { SetFierceDeityEnergyColors(colors[0]); } }