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(Sprite s, PointF location) { if (s.sheet != currentSheet) Flush(); currentSheet = s.sheet; Util.CreateQuad(vertices, indicies, location, s, 0); if (++sprites >= spritesPerBatch) Flush(); } } }