did palette animation the sane way (switching palettes) rather than cycling 0x60-0x66 in the shader

This commit is contained in:
Chris Forbes
2009-10-13 23:02:46 +13:00
parent d8d1def249
commit bebe9bee85
4 changed files with 17 additions and 24 deletions

View File

@@ -13,7 +13,7 @@ namespace OpenRa.Game.Graphics
const int maxEntries = 8; const int maxEntries = 8;
int allocated = 0; int allocated = 0;
public HardwarePalette(Renderer renderer, Map map) public HardwarePalette(Renderer renderer, Map map, int rotate)
: base(renderer,new Size(256, maxEntries)) : base(renderer,new Size(256, maxEntries))
{ {
Palette pal = new Palette(FileSystem.Open(map.Theater + ".pal")); 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" }) foreach (string remap in new string[] { "blue", "red", "orange", "teal", "salmon", "green", "gray" })
AddPalette(new Palette(pal, new PaletteRemap(FileSystem.Open(remap + ".rem")))); 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) int AddPalette(Palette p)

View File

@@ -9,9 +9,15 @@ namespace OpenRa.Game.Graphics
class Renderer class Renderer
{ {
readonly GraphicsDevice device; readonly GraphicsDevice device;
Texture[] palettes;
public Shader SpriteShader { get; private set; } /* note: shared shader params */ public Shader SpriteShader { get; private set; } /* note: shared shader params */
public Shader LineShader { get; private set; } 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) public void SetPalette(HardwarePalette hp)
{ {
SpriteShader.SetValue("Palette", hp.Texture); SpriteShader.SetValue("Palette", hp.Texture);
@@ -37,7 +43,7 @@ namespace OpenRa.Game.Graphics
{ {
device.Begin(); device.Begin();
SpriteShader.SetValue("palDist", waterFrame); SpriteShader.SetValue("Palette", palettes[ (int)(waterFrame * palettes.Length) % palettes.Length ]);
SpriteShader.SetValue("Scroll", scroll); SpriteShader.SetValue("Scroll", scroll);
SpriteShader.SetValue("r1", r1); SpriteShader.SetValue("r1", r1);
SpriteShader.SetValue("r2", r2); SpriteShader.SetValue("r2", r2);

View File

@@ -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( "mcv", new int2( 9, 5 ), game.players[ 0 ] ) );
game.world.Add( new Actor( "jeep", new int2( 9, 7 ), game.players[ 1 ] ) ); game.world.Add( new Actor( "jeep", new int2( 9, 7 ), game.players[ 1 ] ) );
sidebar = new Sidebar(renderer, game); sidebar = new Sidebar(renderer, game);
renderer.SetPalette(new HardwarePalette(renderer, game.map)); renderer.BuildPalette(game.map);
} }
internal void Run() internal void Run()

View File

@@ -6,7 +6,6 @@ shared texture DiffuseTexture, Palette;
shared float2 Scroll; shared float2 Scroll;
shared float2 r1, r2; // matrix elements shared float2 r1, r2; // matrix elements
shared float palDist;
sampler s_DiffuseTexture = sampler_state { sampler s_DiffuseTexture = sampler_state {
Texture = <DiffuseTexture>; Texture = <DiffuseTexture>;
@@ -65,28 +64,11 @@ VertexOut Simple_vp(VertexIn v) {
} }
const float2 texelOffset = float2( 0, 1.0f/32.0f ); 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 Palette_fp(FragmentIn f) : COLOR0 {
float4 x = tex2D(s_DiffuseTexture, f.Tex0.xy); float4 x = tex2D(s_DiffuseTexture, f.Tex0.xy);
float2 p = float2( dot(x, f.ChannelMask), f.Tex0.z ); 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 { technique low_quality {