diff --git a/OpenRA.Game/Graphics/LineRenderer.cs b/OpenRA.Game/Graphics/LineRenderer.cs index a3ede4fa10..63baa7cde5 100644 --- a/OpenRA.Game/Graphics/LineRenderer.cs +++ b/OpenRA.Game/Graphics/LineRenderer.cs @@ -77,5 +77,12 @@ namespace OpenRA.Graphics for (float y = r.Top; y < r.Bottom; y++) DrawLine(new float2(r.Left, y), new float2(r.Right, y), color, color); } + + public void SetShaderParams(ITexture palette, Size screen, float zoom, float2 scroll) + { + shader.SetVec("Scroll", (int)scroll.X, (int)scroll.Y); + shader.SetVec("r1", zoom*2f/screen.Width, -zoom*2f/screen.Height); + shader.SetVec("r2", -1, 1); + } } } diff --git a/OpenRA.Game/Graphics/Renderer.cs b/OpenRA.Game/Graphics/Renderer.cs index 45ac965884..8be5040802 100644 --- a/OpenRA.Game/Graphics/Renderer.cs +++ b/OpenRA.Game/Graphics/Renderer.cs @@ -26,11 +26,6 @@ namespace OpenRA.Graphics internal static int SheetSize; internal static int TempBufferSize; internal static int TempBufferCount; - internal IShader WorldSpriteShader { get; private set; } - internal IShader WorldLineShader { get; private set; } - internal IShader LineShader { get; private set; } - internal IShader RgbaSpriteShader { get; private set; } - internal IShader SpriteShader { get; private set; } public SpriteRenderer WorldSpriteRenderer { get; private set; } public LineRenderer WorldLineRenderer { get; private set; } @@ -50,17 +45,11 @@ namespace OpenRA.Graphics TempBufferCount = Game.Settings.Graphics.NumTempBuffers; SheetSize = Game.Settings.Graphics.SheetSize; - WorldSpriteShader = device.CreateShader("shp"); - WorldLineShader = device.CreateShader("line"); - LineShader = device.CreateShader("line"); - RgbaSpriteShader = device.CreateShader("rgba"); - SpriteShader = device.CreateShader("shp"); - - WorldSpriteRenderer = new SpriteRenderer(this, WorldSpriteShader); - WorldLineRenderer = new LineRenderer(this, WorldLineShader); - LineRenderer = new LineRenderer(this, LineShader); - RgbaSpriteRenderer = new SpriteRenderer(this, RgbaSpriteShader); - SpriteRenderer = new SpriteRenderer(this, SpriteShader); + WorldSpriteRenderer = new SpriteRenderer(this, device.CreateShader("shp")); + WorldLineRenderer = new LineRenderer(this, device.CreateShader("line")); + LineRenderer = new LineRenderer(this, device.CreateShader("line")); + RgbaSpriteRenderer = new SpriteRenderer(this, device.CreateShader("rgba")); + SpriteRenderer = new SpriteRenderer(this, device.CreateShader("shp")); for (int i = 0; i < TempBufferCount; i++) tempBuffers.Enqueue(device.CreateVertexBuffer(TempBufferSize)); @@ -76,23 +65,11 @@ namespace OpenRA.Graphics public void BeginFrame(float2 scroll, float zoom) { device.Clear(); - float2 r1 = new float2(2f/Resolution.Width, -2f/Resolution.Height); - float2 r2 = new float2(-1, 1); - var zr1 = zoom*r1; - - SetShaderParams(WorldSpriteShader, zr1, r2, scroll); - SetShaderParams(WorldLineShader, zr1, r2, scroll); - SetShaderParams(LineShader, r1, r2, float2.Zero); - SetShaderParams(RgbaSpriteShader, r1, r2, float2.Zero); - SetShaderParams(SpriteShader, r1, r2, float2.Zero); - } - - void SetShaderParams(IShader s, float2 r1, float2 r2, float2 scroll) - { - s.SetTexture("Palette", PaletteTexture); - s.SetVec("Scroll", (int)scroll.X, (int)scroll.Y); - s.SetVec("r1", r1.X, r1.Y); - s.SetVec("r2", r2.X, r2.Y); + WorldSpriteRenderer.SetShaderParams(PaletteTexture, Resolution, zoom, scroll); + WorldLineRenderer.SetShaderParams(PaletteTexture, Resolution, zoom, scroll); + SpriteRenderer.SetShaderParams(PaletteTexture, Resolution, 1f, float2.Zero); + LineRenderer.SetShaderParams(PaletteTexture, Resolution, 1f, float2.Zero); + RgbaSpriteRenderer.SetShaderParams(PaletteTexture, Resolution, 1f, float2.Zero); } public void EndFrame(IInputHandler inputHandler) diff --git a/OpenRA.Game/Graphics/SpriteRenderer.cs b/OpenRA.Game/Graphics/SpriteRenderer.cs index 9670441dcf..5140c2a99a 100644 --- a/OpenRA.Game/Graphics/SpriteRenderer.cs +++ b/OpenRA.Game/Graphics/SpriteRenderer.cs @@ -8,6 +8,7 @@ */ #endregion +using System.Drawing; using OpenRA.FileFormats.Graphics; namespace OpenRA.Graphics @@ -27,9 +28,6 @@ namespace OpenRA.Graphics this.shader = shader; } - public SpriteRenderer(Renderer renderer) - : this(renderer, renderer.SpriteShader) { } - public void Flush() { if (nv > 0) @@ -72,7 +70,6 @@ namespace OpenRA.Graphics nv += 4; } - // For RGBASpriteRenderer, which doesn't use palettes public void DrawSprite(Sprite s, float2 location) { @@ -83,5 +80,19 @@ namespace OpenRA.Graphics { DrawSprite(s, location, 0, size); } + + public void DrawVertexBuffer(IVertexBuffer buffer, int start, int length, PrimitiveType type, Sheet sheet) + { + shader.SetTexture("DiffuseTexture", sheet.Texture); + shader.Render(() => renderer.DrawBatch(buffer, start, length, type)); + } + + public void SetShaderParams(ITexture palette, Size screen, float zoom, float2 scroll) + { + shader.SetTexture("Palette", palette); + shader.SetVec("Scroll", (int)scroll.X, (int)scroll.Y); + shader.SetVec("r1", zoom*2f/screen.Width, -zoom*2f/screen.Height); + shader.SetVec("r2", -1, 1); + } } } diff --git a/OpenRA.Game/Graphics/TerrainRenderer.cs b/OpenRA.Game/Graphics/TerrainRenderer.cs index 2468e4d917..7ead56a88b 100644 --- a/OpenRA.Game/Graphics/TerrainRenderer.cs +++ b/OpenRA.Game/Graphics/TerrainRenderer.cs @@ -84,11 +84,9 @@ namespace OpenRA.Graphics if( lastRow < firstRow ) lastRow = firstRow; - Game.Renderer.WorldSpriteShader.SetTexture("DiffuseTexture", terrainSheet.Texture); - Game.Renderer.WorldSpriteShader.Render(() => - Game.Renderer.DrawBatch(vertexBuffer, - verticesPerRow * firstRow, verticesPerRow * (lastRow - firstRow), - PrimitiveType.QuadList)); + Game.Renderer.WorldSpriteRenderer.DrawVertexBuffer( + vertexBuffer, verticesPerRow * firstRow, verticesPerRow * (lastRow - firstRow), + PrimitiveType.QuadList, terrainSheet); foreach (var r in world.WorldActor.TraitsImplementing()) r.Render( wr );