From a6851a1f05e4e9ed4b6786c573baf5074dd0a5a7 Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Sat, 16 Jan 2010 17:53:17 +1300 Subject: [PATCH] chrome version of shp shader --- OpenRa.FileFormats/OpenRa.FileFormats.csproj | 1 - OpenRa.Game/Chrome.cs | 46 +++++---- OpenRa.Game/Graphics/Renderer.cs | 7 +- rgbasprite.fx => chrome-rgba.fx | 0 chrome-shp.fx | 99 ++++++++++++++++++++ sprite.fx => world-shp.fx | 0 6 files changed, 126 insertions(+), 27 deletions(-) rename rgbasprite.fx => chrome-rgba.fx (100%) create mode 100644 chrome-shp.fx rename sprite.fx => world-shp.fx (100%) diff --git a/OpenRa.FileFormats/OpenRa.FileFormats.csproj b/OpenRa.FileFormats/OpenRa.FileFormats.csproj index a41a7b86f3..a6f4b06944 100644 --- a/OpenRa.FileFormats/OpenRa.FileFormats.csproj +++ b/OpenRa.FileFormats/OpenRa.FileFormats.csproj @@ -48,7 +48,6 @@ - diff --git a/OpenRa.Game/Chrome.cs b/OpenRa.Game/Chrome.cs index 24e5bd262b..48ec5768a7 100644 --- a/OpenRa.Game/Chrome.cs +++ b/OpenRa.Game/Chrome.cs @@ -78,7 +78,7 @@ namespace OpenRa.Game this.renderer = r; rgbaRenderer = new SpriteRenderer(renderer, true, renderer.RgbaSpriteShader); lineRenderer = new LineRenderer(renderer); - shpRenderer = new SpriteRenderer(renderer, true); + shpRenderer = new SpriteRenderer(renderer, true, renderer.WorldSpriteShader); repairButton = new Animation("repair"); repairButton.PlayRepeating("normal"); @@ -369,7 +369,7 @@ namespace OpenRa.Game return; // Draw bar horizontally - var barStart = powerOrigin + Game.viewport.Location + radarOrigin; + var barStart = powerOrigin + radarOrigin; var barEnd = barStart + new float2(powerSize.Width, 0); float powerScaleBy = 100; @@ -377,9 +377,9 @@ namespace OpenRa.Game while (maxPower >= powerScaleBy) powerScaleBy *= 2; // Current power supply - var powerLevelTemp = barStart.X + (barEnd.X - barStart.X) * (Game.LocalPlayer.PowerProvided / powerScaleBy) - Game.viewport.Location.X; + var powerLevelTemp = barStart.X + (barEnd.X - barStart.X) * (Game.LocalPlayer.PowerProvided / powerScaleBy); lastPowerProvidedPos = float2.Lerp(lastPowerProvidedPos.GetValueOrDefault(powerLevelTemp), powerLevelTemp, .3f); - float2 powerLevel = new float2(lastPowerProvidedPos.Value + Game.viewport.Location.X, barStart.Y); + float2 powerLevel = new float2(lastPowerProvidedPos.Value, barStart.Y); var color = Color.LimeGreen; if (Game.LocalPlayer.GetPowerState() == PowerState.Low) @@ -405,9 +405,9 @@ namespace OpenRa.Game // Power usage indicator var indicator = SequenceProvider.GetImageFromCollection(renderer, radarCollection, "power-indicator"); - var powerDrainedTemp = barStart.X + (barEnd.X - barStart.X) * (Game.LocalPlayer.PowerDrained / powerScaleBy) - Game.viewport.Location.X; + var powerDrainedTemp = barStart.X + (barEnd.X - barStart.X) * (Game.LocalPlayer.PowerDrained / powerScaleBy); lastPowerDrainedPos = float2.Lerp(lastPowerDrainedPos.GetValueOrDefault(powerDrainedTemp), powerDrainedTemp, .3f); - float2 powerDrainLevel = new float2(lastPowerDrainedPos.Value-indicator.size.X/2, barStart.Y - Game.viewport.Location.Y-1); + float2 powerDrainLevel = new float2(lastPowerDrainedPos.Value-indicator.size.X/2, barStart.Y-1); rgbaRenderer.DrawSprite(indicator, powerDrainLevel, PaletteType.Chrome); rgbaRenderer.Flush(); @@ -418,7 +418,7 @@ namespace OpenRa.Game int2 buttonOrigin = new int2(Game.viewport.Width - 320, 2); // Repair Rectangle repairRect = new Rectangle(buttonOrigin.X, buttonOrigin.Y, repairButton.Image.bounds.Width, repairButton.Image.bounds.Height); - var repairDrawPos = Game.viewport.Location + new float2(repairRect.Location); + var repairDrawPos = new float2(repairRect.Location); var hasFact = Game.world.Actors.Any(a => a.Owner == Game.LocalPlayer && a.traits.Contains()); @@ -435,7 +435,7 @@ namespace OpenRa.Game Rectangle sellRect = new Rectangle(buttonOrigin.X+40, buttonOrigin.Y, sellButton.Image.bounds.Width, sellButton.Image.bounds.Height); - var sellDrawPos = Game.viewport.Location + new float2(sellRect.Location); + var sellDrawPos = new float2(sellRect.Location); sellButton.ReplaceAnim(Game.controller.orderGenerator is SellOrderGenerator ? "pressed" : "normal"); @@ -449,7 +449,7 @@ namespace OpenRa.Game Rectangle pwrdownRect = new Rectangle(buttonOrigin.X+80, buttonOrigin.Y, pwrdownButton.Image.bounds.Width, pwrdownButton.Image.bounds.Height); - var pwrdownDrawPos = Game.viewport.Location + new float2(pwrdownRect.Location); + var pwrdownDrawPos = new float2(pwrdownRect.Location); pwrdownButton.ReplaceAnim(Game.controller.orderGenerator is PowerDownOrderGenerator ? "pressed" : "normal"); @@ -462,7 +462,7 @@ namespace OpenRa.Game Rectangle optionsRect = new Rectangle(0,0, optionsButton.Image.bounds.Width, optionsButton.Image.bounds.Height); - var optionsDrawPos = Game.viewport.Location + new float2(optionsRect.Location); + var optionsDrawPos = new float2(optionsRect.Location); optionsButton.ReplaceAnim(optionsPressed ? "left-pressed" : "left-normal"); @@ -493,28 +493,26 @@ namespace OpenRa.Game if (ss.Length > 8) for( var x = r.Left + (int)ss[2].size.X; x < r.Right - (int)ss[3].size.X; x += (int)ss[8].size.X ) for( var y = r.Top + (int)ss[0].size.Y; y < r.Bottom - (int)ss[1].size.Y; y += (int)ss[8].size.Y ) - sr.DrawSprite(ss[8], Game.viewport.Location + new float2(x, y), PaletteType.Chrome); + sr.DrawSprite(ss[8], new float2(x, y), PaletteType.Chrome); - var p = isShp ? Game.viewport.Location : float2.Zero; - //draw borders for (var y = r.Top + (int)ss[0].size.Y; y < r.Bottom - (int)ss[1].size.Y; y += (int)ss[1].size.Y) { - sr.DrawSprite(ss[2], p + new float2(r.Left, y), PaletteType.Chrome); - sr.DrawSprite(ss[3], p + new float2(r.Right - ss[3].size.X, y), PaletteType.Chrome); + sr.DrawSprite(ss[2], new float2(r.Left, y), PaletteType.Chrome); + sr.DrawSprite(ss[3], new float2(r.Right - ss[3].size.X, y), PaletteType.Chrome); } for (var x = r.Left + (int)ss[2].size.X; x < r.Right - (int)ss[3].size.X; x += (int)ss[3].size.X) { - sr.DrawSprite(ss[0], p + new float2(x, r.Top), PaletteType.Chrome); - sr.DrawSprite(ss[1], p + new float2(x, r.Bottom - ss[1].size.Y), PaletteType.Chrome); + sr.DrawSprite(ss[0], new float2(x, r.Top), PaletteType.Chrome); + sr.DrawSprite(ss[1], new float2(x, r.Bottom - ss[1].size.Y), PaletteType.Chrome); } - sr.DrawSprite(ss[4], p + new float2(r.Left, r.Top), PaletteType.Chrome); - sr.DrawSprite(ss[5], p + new float2(r.Right - ss[5].size.X, r.Top), PaletteType.Chrome); - sr.DrawSprite(ss[6], p + new float2(r.Left, r.Bottom - ss[6].size.Y), PaletteType.Chrome); - sr.DrawSprite(ss[7], p + new float2(r.Right - ss[7].size.X, r.Bottom - ss[7].size.Y), PaletteType.Chrome); + sr.DrawSprite(ss[4], new float2(r.Left, r.Top), PaletteType.Chrome); + sr.DrawSprite(ss[5], new float2(r.Right - ss[5].size.X, r.Top), PaletteType.Chrome); + sr.DrawSprite(ss[6], new float2(r.Left, r.Bottom - ss[6].size.Y), PaletteType.Chrome); + sr.DrawSprite(ss[7], new float2(r.Right - ss[7].size.X, r.Bottom - ss[7].size.Y), PaletteType.Chrome); sr.Flush(); renderer.Device.DisableScissor(); @@ -629,7 +627,7 @@ namespace OpenRa.Game } var rect = new RectangleF(origin.X + x * 64, origin.Y + 48 * y, 64, 48); - var drawPos = Game.viewport.Location + new float2(rect.Location); + var drawPos = new float2(rect.Location); var isBuildingSomething = queue.CurrentItem(queueName) != null; shpRenderer.DrawSprite(tabSprites[item.Name], drawPos, PaletteType.Chrome); @@ -873,7 +871,7 @@ namespace OpenRa.Game var image = spsprites[sp.Key]; if (sp.Value.IsAvailable) { - var drawPos = Game.viewport.Location + new float2(5, y); + var drawPos = new float2(5, y); shpRenderer.DrawSprite(image, drawPos, PaletteType.Chrome); clock.PlayFetchIndex("idle", @@ -897,7 +895,7 @@ namespace OpenRa.Game if (rect.Contains(lastMousePos.ToPoint())) { tooltipItem = sp.Key; - tooltipPos = drawPos.ToInt2() + new int2(72, 0) - Game.viewport.Location.ToInt2(); + tooltipPos = drawPos.ToInt2() + new int2(72, 0); } y += 51; diff --git a/OpenRa.Game/Graphics/Renderer.cs b/OpenRa.Game/Graphics/Renderer.cs index 6edf87e78d..dbbf5b24a5 100644 --- a/OpenRa.Game/Graphics/Renderer.cs +++ b/OpenRa.Game/Graphics/Renderer.cs @@ -15,6 +15,7 @@ namespace OpenRa.Game.Graphics public Shader SpriteShader { get; private set; } /* note: shared shader params */ public Shader LineShader { get; private set; } public Shader RgbaSpriteShader { get; private set; } + public Shader WorldSpriteShader { get; private set; } public Texture PaletteTexture; @@ -27,12 +28,14 @@ namespace OpenRa.Game.Graphics device = GraphicsDevice.Create(host, resolution.Width, resolution.Height, windowed, false); - SpriteShader = new Shader(device, FileSystem.Open("sprite.fx")); + SpriteShader = new Shader(device, FileSystem.Open("world-shp.fx")); SpriteShader.Quality = ShaderQuality.Low; LineShader = new Shader(device, FileSystem.Open("line.fx")); LineShader.Quality = ShaderQuality.High; - RgbaSpriteShader = new Shader(device, FileSystem.Open("rgbasprite.fx")); + RgbaSpriteShader = new Shader(device, FileSystem.Open("chrome-rgba.fx")); RgbaSpriteShader.Quality = ShaderQuality.High; + WorldSpriteShader = new Shader(device, FileSystem.Open("chrome-shp.fx")); + WorldSpriteShader.Quality = ShaderQuality.High; sh = new SpriteHelper(device); fhDebug = new FontHelper(device, "Tahoma", 10, false); diff --git a/rgbasprite.fx b/chrome-rgba.fx similarity index 100% rename from rgbasprite.fx rename to chrome-rgba.fx diff --git a/chrome-shp.fx b/chrome-shp.fx new file mode 100644 index 0000000000..3a47816c2e --- /dev/null +++ b/chrome-shp.fx @@ -0,0 +1,99 @@ +// OpenRA test shader +// Author: C. Forbes +//-------------------------------------------------------- + +shared texture DiffuseTexture, Palette; +shared float2 Scroll; + +shared float2 r1, r2; // matrix elements + +sampler s_DiffuseTexture = sampler_state { + Texture = ; + MinFilter = None; + MagFilter = None; + MipFilter = None; + + AddressU = Wrap; + AddressV = Wrap; + AddressW = Wrap; +}; + +sampler s_PaletteTexture = sampler_state { + Texture = ; + MinFilter = None; + MagFilter = None; + MipFilter = None; + + AddressU = Clamp; + AddressV = Clamp; +}; + +struct VertexIn { + float4 Position: POSITION; + float2 Tex0: TEXCOORD0; + float2 Tex1: TEXCOORD1; +}; + +struct VertexOut { + float4 Position: POSITION; + float3 Tex0: TEXCOORD0; + float4 ChannelMask: TEXCOORD1; +}; + +struct FragmentIn { + float3 Tex0: TEXCOORD0; + float4 ChannelMask: TEXCOORD1; +}; + +float4 DecodeChannelMask( float x ) +{ + if (x > 0) + return (x > 0.5f) ? float4(1,0,0,0) : float4(0,1,0,0); + else + return (x <-0.5f) ? float4(0,0,0,1) : float4(0,0,1,0); +} + +VertexOut Simple_vp(VertexIn v) { + VertexOut o; + + float2 p = v.Position.xy * r1 + r2; + o.Position = float4(p.x,p.y,0,1); + o.Tex0 = float3(v.Tex0.x, v.Tex0.y, v.Tex1.x); + o.ChannelMask = DecodeChannelMask( v.Tex1.y ); + return o; +} + +const float2 texelOffset = float2( 0, 1.0f/32.0f ); + +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, p + texelOffset); +} + +technique low_quality { + pass p0 { + AlphaBlendEnable = false; + ZWriteEnable = false; + ZEnable = false; + CullMode = None; + FillMode = Solid; + VertexShader = compile vs_2_0 Simple_vp(); + PixelShader = compile ps_2_0 Palette_fp(); + } +} + +technique high_quality { + pass p0 { + AlphaBlendEnable = true; + ZWriteEnable = false; + ZEnable = false; + CullMode = None; + FillMode = Solid; + VertexShader = compile vs_2_0 Simple_vp(); + PixelShader = compile ps_2_0 Palette_fp(); + + SrcBlend = SrcAlpha; + DestBlend = InvSrcAlpha; + } +} diff --git a/sprite.fx b/world-shp.fx similarity index 100% rename from sprite.fx rename to world-shp.fx