diff --git a/OpenRa.Game/OpenRa.Game.csproj b/OpenRa.Game/OpenRa.Game.csproj index a9fb1207b8..2f227234a0 100644 --- a/OpenRa.Game/OpenRa.Game.csproj +++ b/OpenRa.Game/OpenRa.Game.csproj @@ -55,6 +55,7 @@ + diff --git a/OpenRa.Game/Sidebar.cs b/OpenRa.Game/Sidebar.cs index bd8c197801..128e381b9b 100644 --- a/OpenRa.Game/Sidebar.cs +++ b/OpenRa.Game/Sidebar.cs @@ -9,55 +9,47 @@ using System.Drawing; namespace OpenRa.Game { using Sprite = SheetRectangle; + class Sidebar { TechTree.TechTree techTree = new TechTree.TechTree(); Renderer renderer; - FvfVertexBuffer vertexBuffer; - IndexBuffer indexBuffer; - const int spritesPerBatch = 1024; + SpriteRenderer spriteRenderer; + Package package; + Dictionary sprites = new Dictionary(); + void LoadSprite(string name) + { + sprites.Add(name, SpriteSheetBuilder.LoadSprite(package, name + "icon.shp")); + } public Sidebar(Race race, Renderer renderer) { - Package package = new Package("../../../hires.mix"); - sprites.Add("e7", SpriteSheetBuilder.LoadSprite(package, "e7icon.shp")); - sprites.Add("e6", SpriteSheetBuilder.LoadSprite(package, "e6icon.shp")); - techTree.CurrentRace = race; this.renderer = renderer; - vertexBuffer = new FvfVertexBuffer(renderer.Device, 4 * spritesPerBatch, Vertex.Format); - indexBuffer = new IndexBuffer(renderer.Device, 6 * spritesPerBatch); + this.spriteRenderer = new SpriteRenderer(renderer); + + package = new Package("../../../hires.mix"); + LoadSprite("E7"); + LoadSprite("E6"); + LoadSprite("POWR"); + techTree.CurrentRace = race; } public void Paint(PointF scrollOffset) { - List vertices = new List(); - List indicies = new List(); - int x = 0, y = 0; - - //foreach (SheetRectangle sprite in sprites.Values) foreach (Item i in techTree.BuildableBuildings) { Sprite sprite; if (!sprites.TryGetValue(i.tag, out sprite)) continue; PointF location = new PointF(x + scrollOffset.X, y + scrollOffset.Y); - Util.CreateQuad(vertices, indicies, location, sprite, 0); + spriteRenderer.DrawSprite(sprite, location); y += 48; } - if (vertices.Count == 0) - return; - - renderer.DrawWithShader(ShaderQuality.Low, delegate - { - vertexBuffer.SetData(vertices.ToArray()); - indexBuffer.SetData(indicies.ToArray()); - foreach (Sprite sprite in sprites.Values) - renderer.DrawBatch(vertexBuffer, indexBuffer, new Range(0, vertices.Count), new Range(0, indicies.Count), sprite.sheet.Texture); - }); + spriteRenderer.Flush(); } } } diff --git a/OpenRa.Game/SpriteRenderer.cs b/OpenRa.Game/SpriteRenderer.cs new file mode 100644 index 0000000000..d524462258 --- /dev/null +++ b/OpenRa.Game/SpriteRenderer.cs @@ -0,0 +1,64 @@ +using System; +using System.Collections.Generic; +using System.Text; +using BluntDirectX.Direct3D; +using OpenRa.FileFormats; +using System.Drawing; + +namespace OpenRa.Game +{ + class SpriteRenderer + { + FvfVertexBuffer vertexBuffer; + IndexBuffer indexBuffer; + Renderer renderer; + + const int spritesPerBatch = 1024; + + List vertices = new List(); + List indicies = new List(); + Sheet currentSheet = null; + int sprites = 0; + + public SpriteRenderer(Renderer renderer) + { + this.renderer = renderer; + + vertexBuffer = new FvfVertexBuffer(renderer.Device, 4 * spritesPerBatch, Vertex.Format); + indexBuffer = new IndexBuffer(renderer.Device, 6 * spritesPerBatch); + } + + public void Flush() + { + if (sprites > 0) + { + renderer.DrawWithShader(ShaderQuality.Low, delegate + { + vertexBuffer.SetData(vertices.ToArray()); + indexBuffer.SetData(indicies.ToArray()); + renderer.DrawBatch(vertexBuffer, indexBuffer, + new Range(0, vertices.Count), + new Range(0, indicies.Count), + currentSheet.Texture); + }); + + vertices = new List(); + indicies = new List(); + currentSheet = null; + sprites = 0; + } + } + + public void DrawSprite(SheetRectangle s, PointF location) + { + if (s.sheet != currentSheet) + Flush(); + + currentSheet = s.sheet; + Util.CreateQuad(vertices, indicies, location, s, 0); + + if (++sprites >= spritesPerBatch) + Flush(); + } + } +}