did palette animation the sane way (switching palettes) rather than cycling 0x60-0x66 in the shader
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
20
sprite.fx
20
sprite.fx
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user