diff --git a/OpenRa.Game/Graphics/HardwarePalette.cs b/OpenRa.Game/Graphics/HardwarePalette.cs index d1a6e88020..d76e423a0f 100644 --- a/OpenRa.Game/Graphics/HardwarePalette.cs +++ b/OpenRa.Game/Graphics/HardwarePalette.cs @@ -13,7 +13,7 @@ namespace OpenRa.Game.Graphics const int maxEntries = 8; int allocated = 0; - public HardwarePalette(Renderer renderer, Map map) + public HardwarePalette(Renderer renderer, Map map, int rotate) : base(renderer,new Size(256, maxEntries)) { Palette pal = new Palette(FileSystem.Open(map.Theater + ".pal")); @@ -21,6 +21,11 @@ namespace OpenRa.Game.Graphics foreach (string remap in new string[] { "blue", "red", "orange", "teal", "salmon", "green", "gray" }) AddPalette(new Palette(pal, new PaletteRemap(FileSystem.Open(remap + ".rem")))); + + using (var bitmapCopy = new Bitmap(bitmap)) + for (int j = 0; j < maxEntries; j++) + for (int i = 0; i < 7; i++) + this[new Point(0x60 + i, j)] = bitmapCopy.GetPixel(0x60 + (rotate + i) % 7, j); } int AddPalette(Palette p) diff --git a/OpenRa.Game/Graphics/Renderer.cs b/OpenRa.Game/Graphics/Renderer.cs index 453f2f06c7..a15d67412d 100644 --- a/OpenRa.Game/Graphics/Renderer.cs +++ b/OpenRa.Game/Graphics/Renderer.cs @@ -9,9 +9,15 @@ namespace OpenRa.Game.Graphics class Renderer { readonly GraphicsDevice device; + Texture[] palettes; public Shader SpriteShader { get; private set; } /* note: shared shader params */ public Shader LineShader { get; private set; } + public void BuildPalette(Map map) + { + palettes = Util.MakeArray(7, i => new HardwarePalette(this, map, i).Texture); + } + public void SetPalette(HardwarePalette hp) { SpriteShader.SetValue("Palette", hp.Texture); @@ -37,7 +43,7 @@ namespace OpenRa.Game.Graphics { device.Begin(); - SpriteShader.SetValue("palDist", waterFrame); + SpriteShader.SetValue("Palette", palettes[ (int)(waterFrame * palettes.Length) % palettes.Length ]); SpriteShader.SetValue("Scroll", scroll); SpriteShader.SetValue("r1", r1); SpriteShader.SetValue("r2", r2); diff --git a/OpenRa.Game/MainWindow.cs b/OpenRa.Game/MainWindow.cs index 25b1813c74..3f05bf0e80 100644 --- a/OpenRa.Game/MainWindow.cs +++ b/OpenRa.Game/MainWindow.cs @@ -51,9 +51,9 @@ namespace OpenRa.Game game.world.Add( new Actor( "mcv", new int2( 9, 5 ), game.players[ 0 ] ) ); game.world.Add( new Actor( "jeep", new int2( 9, 7 ), game.players[ 1 ] ) ); - sidebar = new Sidebar(renderer, game); - - renderer.SetPalette(new HardwarePalette(renderer, game.map)); + sidebar = new Sidebar(renderer, game); + + renderer.BuildPalette(game.map); } internal void Run() diff --git a/sprite.fx b/sprite.fx index 745c28823b..c11e8b88df 100644 --- a/sprite.fx +++ b/sprite.fx @@ -6,7 +6,6 @@ shared texture DiffuseTexture, Palette; shared float2 Scroll; shared float2 r1, r2; // matrix elements -shared float palDist; sampler s_DiffuseTexture = sampler_state { Texture = ; @@ -65,28 +64,11 @@ VertexOut Simple_vp(VertexIn v) { } const float2 texelOffset = float2( 0, 1.0f/32.0f ); -const float animBase = (96.0f/256.0f); -const float animLen = (7.0f/256.0f); - -float DoPaletteAnimation( float x ) -{ - float a = (x - animBase) / animLen; - float b = (a >= 0 && a <= 1) ? 1.0f : 0.0f; - float _; - float c = modf(a + palDist, _); - - return lerp( a, c, b ) * animLen + animBase; -} - -float2 DoPaletteAnimation2( float2 x ) -{ - return float2( DoPaletteAnimation(x.x), x.y ); -} float4 Palette_fp(FragmentIn f) : COLOR0 { float4 x = tex2D(s_DiffuseTexture, f.Tex0.xy); float2 p = float2( dot(x, f.ChannelMask), f.Tex0.z ); - return tex2D(s_PaletteTexture, DoPaletteAnimation2(p) + texelOffset); + return tex2D(s_PaletteTexture, p + texelOffset); } technique low_quality {