Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Move ColorShift traits into the main repo. #21238

Merged
merged 1 commit into from
Dec 2, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
84 changes: 84 additions & 0 deletions OpenRA.Mods.Common/Traits/Palettes/ColorPickerColorShift.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
#region Copyright & License Information
/*
* Copyright (c) The OpenRA Developers and Contributors
* This file is part of OpenRA, which is free software. It is made
* available to you under the terms of the GNU General Public License
* as published by the Free Software Foundation, either version 3 of
* the License, or (at your option) any later version. For more
* information, see COPYING.
*/
#endregion

using OpenRA.Graphics;
using OpenRA.Primitives;
using OpenRA.Traits;

namespace OpenRA.Mods.Common.Traits
{
[TraitLocation(SystemActors.World | SystemActors.EditorWorld)]
[Desc("Create a color picker palette from another palette.")]
sealed class ColorPickerColorShiftInfo : TraitInfo
{
[PaletteReference]
[FieldLoader.Require]
[Desc("The name of the palette to base off.")]
public readonly string BasePalette = null;

[Desc("Hues between this and MaxHue will be shifted.")]
public readonly float MinHue = 0.29f;

[Desc("Hues between MinHue and this will be shifted.")]
public readonly float MaxHue = 0.37f;

[Desc("Hue reference for the color shift.")]
public readonly float ReferenceHue = 0.33f;

[Desc("Saturation reference for the color shift.")]
public readonly float ReferenceSaturation = 0.925f;

[Desc("Value reference for the color shift.")]
public readonly float ReferenceValue = 0.95f;

public override object Create(ActorInitializer init) { return new ColorPickerColorShift(this); }
}

sealed class ColorPickerColorShift : ILoadsPalettes, ITickRender
{
readonly ColorPickerColorShiftInfo info;
Color color;
Color preferredColor;

public ColorPickerColorShift(ColorPickerColorShiftInfo info)
{
this.info = info;

// All users need to use the same TraitInfo instance, chosen as the default mod rules
var colorManager = Game.ModData.DefaultRules.Actors[SystemActors.World].TraitInfo<IColorPickerManagerInfo>();
colorManager.OnColorPickerColorUpdate += c => preferredColor = c;
preferredColor = Game.Settings.Player.Color;
}

void ILoadsPalettes.LoadPalettes(WorldRenderer wr)
{
color = preferredColor;
var (r, g, b) = color.ToLinear();
var (h, s, v) = Color.RgbToHsv(r, g, b);
wr.SetPaletteColorShift(info.BasePalette,
h - info.ReferenceHue, s - info.ReferenceSaturation, v / info.ReferenceValue,
info.MinHue, info.MaxHue);
}

void ITickRender.TickRender(WorldRenderer wr, Actor self)
{
if (color == preferredColor)
return;

color = preferredColor;
var (r, g, b) = color.ToLinear();
var (h, s, v) = Color.RgbToHsv(r, g, b);
wr.SetPaletteColorShift(info.BasePalette,
h - info.ReferenceHue, s - info.ReferenceSaturation, v / info.ReferenceValue,
info.MinHue, info.MaxHue);
}
}
}
66 changes: 66 additions & 0 deletions OpenRA.Mods.Common/Traits/Palettes/FixedColorShift.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
#region Copyright & License Information
/*
* Copyright (c) The OpenRA Developers and Contributors
* This file is part of OpenRA, which is free software. It is made
* available to you under the terms of the GNU General Public License
* as published by the Free Software Foundation, either version 3 of
* the License, or (at your option) any later version. For more
* information, see COPYING.
*/
#endregion

using OpenRA.Graphics;
using OpenRA.Primitives;
using OpenRA.Traits;

namespace OpenRA.Mods.Mobius.Traits
{
[TraitLocation(SystemActors.World | SystemActors.EditorWorld)]
[Desc("Apply a fixed color shift to a palette. Use this to add RGBA compatibility to FixedColorPalette.")]
public class FixedColorShiftInfo : TraitInfo
{
[PaletteReference]
[FieldLoader.Require]
[Desc("The name of the palette to base off.")]
public readonly string BasePalette = null;

[Desc("The fixed color to remap.")]
public readonly Color Color;

[Desc("Hues between this and MaxHue will be shifted.")]
public readonly float MinHue = 0.29f;

[Desc("Hues between MinHue and this will be shifted.")]
public readonly float MaxHue = 0.37f;

[Desc("Hue reference for the color shift.")]
public readonly float ReferenceHue = 0.33f;

[Desc("Saturation reference for the color shift.")]
public readonly float ReferenceSaturation = 0.925f;

[Desc("Value reference for the color shift.")]
public readonly float ReferenceValue = 0.95f;

public override object Create(ActorInitializer init) { return new FixedColorShift(this); }
}

public class FixedColorShift : ILoadsPalettes
{
readonly FixedColorShiftInfo info;

public FixedColorShift(FixedColorShiftInfo info)
{
this.info = info;
}

public void LoadPalettes(WorldRenderer wr)
{
var (r, g, b) = info.Color.ToLinear();
var (h, s, v) = Color.RgbToHsv(r, g, b);
wr.SetPaletteColorShift(info.BasePalette,
h - info.ReferenceHue, s - info.ReferenceSaturation, v / info.ReferenceValue,
info.MinHue, info.MaxHue);
}
}
}
48 changes: 48 additions & 0 deletions OpenRA.Mods.Common/Traits/Palettes/FixedPlayerColorShift.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
#region Copyright & License Information
/*
* Copyright (c) The OpenRA Developers and Contributors
* This file is part of OpenRA, which is free software. It is made
* available to you under the terms of the GNU General Public License
* as published by the Free Software Foundation, either version 3 of
* the License, or (at your option) any later version. For more
* information, see COPYING.
*/
#endregion

using System.Collections.Generic;
using OpenRA.Graphics;
using OpenRA.Primitives;
using OpenRA.Traits;

namespace OpenRA.Mods.Common.Traits
{
[TraitLocation(SystemActors.World | SystemActors.EditorWorld)]
[Desc("Add fixed color shifts to player palettes. Use to add RGBA compatibility to IndexedPlayerPalette.")]
public class FixedPlayerColorShiftInfo : TraitInfo
{
[PaletteReference(true)]
[FieldLoader.Require]
[Desc("The name of the palette to base off.")]
public readonly string BasePalette = null;

public readonly Dictionary<string, float[]> PlayerIndex;

public override object Create(ActorInitializer init) { return new FixedPlayerColorShift(this); }
}

public class FixedPlayerColorShift : ILoadsPlayerPalettes
{
readonly FixedPlayerColorShiftInfo info;

public FixedPlayerColorShift(FixedPlayerColorShiftInfo info)
{
this.info = info;
}

public void LoadPlayerPalettes(WorldRenderer wr, string playerName, Color color, bool replaceExisting)
{
if (info.PlayerIndex.TryGetValue(playerName, out var shift))
wr.SetPaletteColorShift(info.BasePalette + playerName, shift[0], shift[1], shift[2], shift[3], shift[4]);
}
}
}
63 changes: 63 additions & 0 deletions OpenRA.Mods.Common/Traits/Palettes/PlayerColorShift.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
#region Copyright & License Information
/*
* Copyright (c) The OpenRA Developers and Contributors
* This file is part of OpenRA, which is free software. It is made
* available to you under the terms of the GNU General Public License
* as published by the Free Software Foundation, either version 3 of
* the License, or (at your option) any later version. For more
* information, see COPYING.
*/
#endregion

using OpenRA.Graphics;
using OpenRA.Primitives;
using OpenRA.Traits;

namespace OpenRA.Mods.Common.Traits
{
[TraitLocation(SystemActors.World | SystemActors.EditorWorld)]
[Desc("Add color shifts to player palettes. Use to add RGBA compatibility to PlayerColorPalette.")]
public class PlayerColorShiftInfo : TraitInfo
{
[PaletteReference(true)]
[FieldLoader.Require]
[Desc("The name of the palette to base off.")]
public readonly string BasePalette = null;

[Desc("Hues between this and MaxHue will be shifted.")]
public readonly float MinHue = 0.29f;

[Desc("Hues between MinHue and this will be shifted.")]
public readonly float MaxHue = 0.37f;

[Desc("Hue reference for the color shift.")]
public readonly float ReferenceHue = 0.33f;

[Desc("Saturation reference for the color shift.")]
public readonly float ReferenceSaturation = 0.925f;

[Desc("Value reference for the color shift.")]
public readonly float ReferenceValue = 0.95f;

public override object Create(ActorInitializer init) { return new PlayerColorShift(this); }
}

public class PlayerColorShift : ILoadsPlayerPalettes
{
readonly PlayerColorShiftInfo info;

public PlayerColorShift(PlayerColorShiftInfo info)
{
this.info = info;
}

public void LoadPlayerPalettes(WorldRenderer wr, string playerName, Color color, bool replaceExisting)
{
var (r, g, b) = color.ToLinear();
var (h, s, v) = Color.RgbToHsv(r, g, b);
wr.SetPaletteColorShift(info.BasePalette + playerName,
h - info.ReferenceHue, s - info.ReferenceSaturation, v / info.ReferenceValue,
info.MinHue, info.MaxHue);
}
}
}