diff --git a/OpenRa.Game/MainWindow.cs b/OpenRa.Game/MainWindow.cs index 0ccefb7f4d..ca823ea92f 100644 --- a/OpenRa.Game/MainWindow.cs +++ b/OpenRa.Game/MainWindow.cs @@ -47,7 +47,7 @@ namespace OpenRa.Game renderer.SetPalette(new HardwarePalette(renderer.Device, map)); terrain = new TerrainRenderer(renderer, map, TileMix); - world = new World(renderer.Device); + world = new World(renderer); treeCache = new TreeCache(renderer.Device, map, TileMix); foreach (TreeReference treeReference in map.Trees) diff --git a/OpenRa.Game/Sidebar.cs b/OpenRa.Game/Sidebar.cs index f83704779b..66b9cea50a 100644 --- a/OpenRa.Game/Sidebar.cs +++ b/OpenRa.Game/Sidebar.cs @@ -22,12 +22,7 @@ namespace OpenRa.Game { techTree.CurrentRace = race; techTree.Build("FACT", true); - //techTree.Build("POWR"); - //techTree.Build("BARR"); - //techTree.Build("PROC"); - //techTree.Build("WEAP"); - //techTree.Build("DOME"); - spriteRenderer = new SpriteRenderer(renderer); + spriteRenderer = new SpriteRenderer(renderer, false); package = new Package("../../../hires.mix"); LoadSprites("../../../buildings.txt"); @@ -47,7 +42,7 @@ namespace OpenRa.Game void DrawSprite(Sprite s, ref PointF p) { - spriteRenderer.DrawSprite(s, p); + spriteRenderer.DrawSprite(s, p, 0); p.Y += 48; } diff --git a/OpenRa.Game/SpriteRenderer.cs b/OpenRa.Game/SpriteRenderer.cs index f3b7b36b02..82b47abb50 100644 --- a/OpenRa.Game/SpriteRenderer.cs +++ b/OpenRa.Game/SpriteRenderer.cs @@ -19,20 +19,23 @@ namespace OpenRa.Game List indicies = new List(); Sheet currentSheet = null; int sprites = 0; + ShaderQuality quality; - public SpriteRenderer(Renderer renderer) + public SpriteRenderer(Renderer renderer, bool allowAlpha) { this.renderer = renderer; vertexBuffer = new FvfVertexBuffer(renderer.Device, 4 * spritesPerBatch, Vertex.Format); indexBuffer = new IndexBuffer(renderer.Device, 6 * spritesPerBatch); + + quality = allowAlpha ? ShaderQuality.High : ShaderQuality.Low; } public void Flush() { if (sprites > 0) { - renderer.DrawWithShader(ShaderQuality.Low, delegate + renderer.DrawWithShader(quality, delegate { vertexBuffer.SetData(vertices.ToArray()); indexBuffer.SetData(indicies.ToArray()); @@ -49,13 +52,13 @@ namespace OpenRa.Game } } - public void DrawSprite(Sprite s, PointF location) + public void DrawSprite(Sprite s, PointF location, int palette) { if (s.sheet != currentSheet) Flush(); currentSheet = s.sheet; - Util.CreateQuad(vertices, indicies, location, s, 0); + Util.CreateQuad(vertices, indicies, location, s, palette); if (++sprites >= spritesPerBatch) Flush(); diff --git a/OpenRa.Game/World.cs b/OpenRa.Game/World.cs index 361b969100..c879d6b1cf 100644 --- a/OpenRa.Game/World.cs +++ b/OpenRa.Game/World.cs @@ -9,41 +9,18 @@ namespace OpenRa.Game { class World { - const int spritesPerBatch = 1024; - List actors = new List(); - FvfVertexBuffer vb; - IndexBuffer ib; - GraphicsDevice device; + SpriteRenderer spriteRenderer; - public World(GraphicsDevice device) + public World(Renderer renderer) { - this.device = device; - this.vb = new FvfVertexBuffer(device, spritesPerBatch * 4, Vertex.Format); - this.ib = new IndexBuffer(device, spritesPerBatch * 6); + spriteRenderer = new SpriteRenderer(renderer, true); } - public void Add(Actor a) - { - actors.Add(a); //todo: protect from concurrent modification - } - - // assumption: its not going to hurt, to draw *all* units. - // in reality, 500 tanks is going to hurt our perf. - - // assumption: we dont skip around between sheets much. otherwise, our perf is going to SUCK. - // this can be fixed by pooling vertex/index lists, except that breaks z-ordering - // across sheets. - - // assumption: when people fix these items, they might update the warning comment? + public void Add(Actor a) { actors.Add(a); } public void Draw(Renderer renderer, Range xr, Range yr) { - int sprites = 0; - List vertices = new List(); - List indices = new List(); - Sheet sheet = null; - foreach (Actor a in actors) { Sprite[] images = a.CurrentImages; @@ -58,47 +35,10 @@ namespace OpenRa.Game continue; foreach (Sprite image in images) - { - if( image.sheet != sheet && sprites > 0 && sheet != null ) - { - DrawBatch( vertices, indices, renderer, sheet ); - - vertices = new List(); - indices = new List(); - sprites = 0; - } - - sheet = image.sheet; - Util.CreateQuad(vertices, indices, a.location, image, a.palette); - - if (++sprites >= spritesPerBatch) - { - DrawBatch(vertices, indices, renderer, sheet); - - vertices = new List(); - indices = new List(); - sprites = 0; - } - } + spriteRenderer.DrawSprite(image, a.location, a.palette); } - if (sprites > 0) - DrawBatch(vertices, indices, renderer, sheet); - } - - void DrawBatch(List vertices, List indices, Renderer renderer, Sheet sheet) - { - vb.SetData(vertices.ToArray()); - ib.SetData(indices.ToArray()); - - renderer.DrawWithShader(ShaderQuality.High, - delegate - { - renderer.DrawBatch(vb, ib, - new Range(0, vertices.Count), - new Range(0, indices.Count), - sheet.Texture); - }); + spriteRenderer.Flush(); } } }