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();
+ }
+ }
+}