From 0f98df9a88ad357668377c680a44e6b9b9b2271f Mon Sep 17 00:00:00 2001 From: Bob Date: Sun, 11 Apr 2010 20:27:32 +1200 Subject: [PATCH] remove SpriteRenderer arg to DrawText; create only one SpriteRenderer for each Shader --- OpenRA.Game/Chrome.cs | 41 ++++++++++---------- OpenRA.Game/Graphics/Minimap.cs | 2 +- OpenRA.Game/Graphics/Renderer.cs | 8 ++++ OpenRA.Game/Graphics/SpriteFont.cs | 7 +++- OpenRA.Game/Graphics/TerrainRenderer.cs | 1 - OpenRA.Game/Graphics/Viewport.cs | 9 ++++- OpenRA.Game/Graphics/WorldRenderer.cs | 2 +- OpenRA.Game/Traits/World/BibLayer.cs | 2 +- OpenRA.Game/Traits/World/ResourceLayer.cs | 2 +- OpenRA.Game/Traits/World/SmudgeLayer.cs | 2 +- OpenRA.Game/Widgets/ButtonWidget.cs | 2 +- OpenRA.Game/Widgets/CheckboxWidget.cs | 4 +- OpenRA.Game/Widgets/LabelWidget.cs | 4 +- OpenRA.Game/Widgets/SpecialPowerBinWidget.cs | 14 +++---- OpenRA.Game/Widgets/WidgetUtils.cs | 8 ++-- 15 files changed, 62 insertions(+), 46 deletions(-) diff --git a/OpenRA.Game/Chrome.cs b/OpenRA.Game/Chrome.cs index 05769a7b3e..7e70f5bf88 100644 --- a/OpenRA.Game/Chrome.cs +++ b/OpenRA.Game/Chrome.cs @@ -35,9 +35,10 @@ namespace OpenRA class Chrome : IHandleInput { public readonly Renderer renderer; - public readonly SpriteRenderer rgbaRenderer; public readonly LineRenderer lineRenderer; - public readonly SpriteRenderer shpRenderer; + + SpriteRenderer rgbaRenderer { get { return renderer.RgbaSpriteRenderer; } } + SpriteRenderer shpRenderer { get { return renderer.WorldSpriteRenderer; } } string chromeCollection; string radarCollection; @@ -87,9 +88,7 @@ namespace OpenRA public Chrome(Renderer r, Manifest m) { this.renderer = r; - rgbaRenderer = new SpriteRenderer(renderer, renderer.RgbaSpriteShader); lineRenderer = new LineRenderer(renderer); - shpRenderer = new SpriteRenderer(renderer, renderer.WorldSpriteShader); tabSprites = Rules.Info.Values .Where(u => u.Traits.Contains()) @@ -311,7 +310,7 @@ namespace OpenRA DrawDialogBackground(itemRect, "dialog2"); } - renderer.RegularFont.DrawText(rgbaRenderer, map.Title, new int2(r.Left + 60, y), Color.White); + renderer.RegularFont.DrawText(map.Title, new int2(r.Left + 60, y), Color.White); rgbaRenderer.Flush(); var closureMap = map; AddButton(itemRect, _ => { currentMap = closureMap; mapPreviewDirty = true; }); @@ -478,11 +477,11 @@ namespace OpenRA var f = renderer.BoldFont; - f.DrawText(rgbaRenderer, "Name", new int2(r.Left + 40, r.Top + 50), Color.White); - f.DrawText(rgbaRenderer, "Color", new int2(r.Left + 140, r.Top + 50), Color.White); - f.DrawText(rgbaRenderer, "Faction", new int2(r.Left + 220, r.Top + 50), Color.White); - f.DrawText(rgbaRenderer, "Status", new int2(r.Left + 290, r.Top + 50), Color.White); - f.DrawText(rgbaRenderer, "Spawn", new int2(r.Left + 390, r.Top + 50), Color.White); + f.DrawText("Name", new int2(r.Left + 40, r.Top + 50), Color.White); + f.DrawText("Color", new int2(r.Left + 140, r.Top + 50), Color.White); + f.DrawText("Faction", new int2(r.Left + 220, r.Top + 50), Color.White); + f.DrawText("Status", new int2(r.Left + 290, r.Top + 50), Color.White); + f.DrawText("Spawn", new int2(r.Left + 390, r.Top + 50), Color.White); rgbaRenderer.Flush(); @@ -517,16 +516,16 @@ namespace OpenRA shpRenderer.Flush(); f = renderer.RegularFont; - f.DrawText(rgbaRenderer, client.Name, new int2(r.Left + 40, y), Color.White); + f.DrawText(client.Name, new int2(r.Left + 40, y), Color.White); lineRenderer.FillRect(RectangleF.FromLTRB(paletteRect.Left + Game.viewport.Location.X + 5, paletteRect.Top + Game.viewport.Location.Y + 5, paletteRect.Right + Game.viewport.Location.X - 5, paletteRect.Bottom+Game.viewport.Location.Y - 5), Player.PlayerColors[client.PaletteIndex % Player.PlayerColors.Count()].c); lineRenderer.Flush(); - f.DrawText(rgbaRenderer, client.Country, new int2(r.Left + 220, y), Color.White); - f.DrawText(rgbaRenderer, client.State.ToString(), new int2(r.Left + 290, y), Color.White); - f.DrawText(rgbaRenderer, (client.SpawnPoint == 0) ? "-" : client.SpawnPoint.ToString(), new int2(r.Left + 410, y), Color.White); + f.DrawText(client.Country, new int2(r.Left + 220, y), Color.White); + f.DrawText(client.State.ToString(), new int2(r.Left + 290, y), Color.White); + f.DrawText((client.SpawnPoint == 0) ? "-" : client.SpawnPoint.ToString(), new int2(r.Left + 410, y), Color.White); y += 30; rgbaRenderer.Flush(); @@ -811,8 +810,8 @@ namespace OpenRA void RenderChatLine(Tuple line, int2 p) { var size = renderer.RegularFont.Measure(line.b); - renderer.RegularFont.DrawText(rgbaRenderer, line.b, p, line.a); - renderer.RegularFont.DrawText(rgbaRenderer, line.c, p + new int2(size.X + 10, 0), Color.White); + renderer.RegularFont.DrawText(line.b, p, line.a); + renderer.RegularFont.DrawText(line.c, p + new int2(size.X + 10, 0), Color.White); } void TickPaletteAnimation() @@ -1075,12 +1074,12 @@ namespace OpenRA void DrawRightAligned(string text, int2 pos, Color c) { - renderer.BoldFont.DrawText(rgbaRenderer, text, pos - new int2(renderer.BoldFont.Measure(text).X, 0), c); + renderer.BoldFont.DrawText(text, pos - new int2(renderer.BoldFont.Measure(text).X, 0), c); } void DrawCentered(string text, int2 pos, Color c) { - renderer.BoldFont.DrawText(rgbaRenderer, text, pos - new int2(renderer.BoldFont.Measure(text).X / 2, 0), c); + renderer.BoldFont.DrawText(text, pos - new int2(renderer.BoldFont.Measure(text).X / 2, 0), c); } void DrawProductionTooltip(World world, string unit, int2 pos) @@ -1093,7 +1092,7 @@ namespace OpenRA var info = Rules.Info[unit]; var buildable = info.Traits.Get(); - renderer.BoldFont.DrawText(rgbaRenderer, buildable.Description, p.ToInt2() + new int2(5, 5), Color.White); + renderer.BoldFont.DrawText(buildable.Description, p.ToInt2() + new int2(5, 5), Color.White); DrawRightAligned( "${0}".F(buildable.Cost), pos + new int2(-5,5), world.LocalPlayer.Cash + world.LocalPlayer.Ore >= buildable.Cost ? Color.White : Color.Red); @@ -1111,14 +1110,14 @@ namespace OpenRA { var prereqs = buildable.Prerequisites .Select( a => Description( a ) ); - renderer.RegularFont.DrawText(rgbaRenderer, "Requires {0}".F(string.Join(", ", prereqs.ToArray())), p.ToInt2(), + renderer.RegularFont.DrawText("Requires {0}".F(string.Join(", ", prereqs.ToArray())), p.ToInt2(), Color.White); } if (buildable.LongDesc != null) { p += new int2(0, 15); - renderer.RegularFont.DrawText(rgbaRenderer, buildable.LongDesc.Replace( "\\n", "\n" ), p.ToInt2(), Color.White); + renderer.RegularFont.DrawText(buildable.LongDesc.Replace( "\\n", "\n" ), p.ToInt2(), Color.White); } rgbaRenderer.Flush(); diff --git a/OpenRA.Game/Graphics/Minimap.cs b/OpenRA.Game/Graphics/Minimap.cs index 0ea7a910b4..9bea10e6e1 100644 --- a/OpenRA.Game/Graphics/Minimap.cs +++ b/OpenRA.Game/Graphics/Minimap.cs @@ -51,7 +51,7 @@ namespace OpenRA.Graphics mapOnlySheet = new Sheet(r, new Size(world.Map.MapSize.X, world.Map.MapSize.Y)); lineRenderer = new LineRenderer(r); - rgbaRenderer = new SpriteRenderer(r, r.RgbaSpriteShader); + rgbaRenderer = r.RgbaSpriteRenderer; var size = Math.Max(world.Map.Width, world.Map.Height); var dw = (size - world.Map.Width) / 2; var dh = (size - world.Map.Height) / 2; diff --git a/OpenRA.Game/Graphics/Renderer.cs b/OpenRA.Game/Graphics/Renderer.cs index 6ec5f7fabe..ee3ba8aefe 100644 --- a/OpenRA.Game/Graphics/Renderer.cs +++ b/OpenRA.Game/Graphics/Renderer.cs @@ -41,6 +41,10 @@ namespace OpenRA.Graphics public IShader RgbaSpriteShader { get; private set; } public IShader WorldSpriteShader { get; private set; } + public SpriteRenderer SpriteRenderer { get; private set; } + public SpriteRenderer RgbaSpriteRenderer { get; private set; } + public SpriteRenderer WorldSpriteRenderer { get; private set; } + public ITexture PaletteTexture; public readonly SpriteFont RegularFont, BoldFont; @@ -56,6 +60,10 @@ namespace OpenRA.Graphics RgbaSpriteShader = device.CreateShader(FileSystem.Open("shaders/chrome-rgba.fx")); WorldSpriteShader = device.CreateShader(FileSystem.Open("shaders/chrome-shp.fx")); + SpriteRenderer = new SpriteRenderer( this, SpriteShader ); + RgbaSpriteRenderer = new SpriteRenderer( this, RgbaSpriteShader ); + WorldSpriteRenderer = new SpriteRenderer( this, WorldSpriteShader ); + // RegularFont = device.CreateFont( "FreeSans.ttf" ); // BoldFont = device.CreateFont( "FreeSansBold.ttf" ); diff --git a/OpenRA.Game/Graphics/SpriteFont.cs b/OpenRA.Game/Graphics/SpriteFont.cs index 9b56442306..5b69601d4b 100644 --- a/OpenRA.Game/Graphics/SpriteFont.cs +++ b/OpenRA.Game/Graphics/SpriteFont.cs @@ -9,9 +9,12 @@ namespace OpenRA.Graphics { class SpriteFont { + Renderer renderer; int size; + public SpriteFont(Renderer r, string name, int size) { + this.renderer = r; this.size = size; if (0 != FT.FT_New_Face(library, name, 0, out face)) @@ -29,7 +32,7 @@ namespace OpenRA.Graphics throw new InvalidOperationException(); } - public void DrawText(SpriteRenderer r, string text, float2 location, Color c) + public void DrawText( string text, float2 location, Color c ) { location.Y += size; // baseline vs top @@ -44,7 +47,7 @@ namespace OpenRA.Graphics } var g = glyphs[s]; - r.DrawSprite(g.Sprite, + renderer.RgbaSpriteRenderer.DrawSprite(g.Sprite, new float2( (int)Math.Round(p.X + g.Offset.X, 0), p.Y + g.Offset.Y), diff --git a/OpenRA.Game/Graphics/TerrainRenderer.cs b/OpenRA.Game/Graphics/TerrainRenderer.cs index 400ff7979a..47a8be7ed0 100644 --- a/OpenRA.Game/Graphics/TerrainRenderer.cs +++ b/OpenRA.Game/Graphics/TerrainRenderer.cs @@ -100,7 +100,6 @@ namespace OpenRA.Graphics if( lastRow < firstRow ) lastRow = firstRow; - renderer.SpriteShader.SetValue( "DiffuseTexture", terrainSheet.Texture ); renderer.SpriteShader.Render(() => renderer.DrawBatch(vertexBuffer, indexBuffer, new Range(verticesPerRow * firstRow, verticesPerRow * lastRow), diff --git a/OpenRA.Game/Graphics/Viewport.cs b/OpenRA.Game/Graphics/Viewport.cs index 57e0b50d1f..539d35ef21 100644 --- a/OpenRA.Game/Graphics/Viewport.cs +++ b/OpenRA.Game/Graphics/Viewport.cs @@ -58,7 +58,7 @@ namespace OpenRA.Graphics { this.screenSize = screenSize; this.renderer = renderer; - cursorRenderer = new SpriteRenderer(renderer); + cursorRenderer = renderer.SpriteRenderer; this.scrollPosition = Game.CellSize* mapStart; } @@ -67,6 +67,8 @@ namespace OpenRA.Graphics bool gameWasStarted = false; public void DrawRegions( World world ) { + Timer.Time( "DrawRegions start" ); + world.WorldRenderer.palette.Update( world.WorldActor.traits.WithInterface()); @@ -75,6 +77,7 @@ namespace OpenRA.Graphics renderer.BeginFrame(r1, r2, scrollPosition.ToInt2()); world.WorldRenderer.Draw(); + Timer.Time( "worldRenderer: {0}" ); if( Game.orderManager.GameStarted && world.LocalPlayer != null) { if (!gameWasStarted) @@ -136,12 +139,16 @@ namespace OpenRA.Graphics lastConnectionState = state; } + Timer.Time( "checking connections: {0}" ); + Game.chrome.DrawWidgets(world); + Timer.Time( "widgets: {0}" ); var cursorName = Game.chrome.HitTest(mousePos) ? "default" : Game.controller.ChooseCursor( world ); var c = new Cursor(cursorName); cursorRenderer.DrawSprite(c.GetSprite((int)cursorFrame), mousePos + Location - c.GetHotspot(), "cursor"); cursorRenderer.Flush(); + Timer.Time( "cursors: {0}" ); renderer.EndFrame(); } diff --git a/OpenRA.Game/Graphics/WorldRenderer.cs b/OpenRA.Game/Graphics/WorldRenderer.cs index 6856c7e845..1eeee1aa3e 100644 --- a/OpenRA.Game/Graphics/WorldRenderer.cs +++ b/OpenRA.Game/Graphics/WorldRenderer.cs @@ -42,7 +42,7 @@ namespace OpenRA.Graphics this.renderer = renderer; terrainRenderer = new TerrainRenderer(world, renderer, this); - spriteRenderer = new SpriteRenderer(renderer); + spriteRenderer = renderer.SpriteRenderer; lineRenderer = new LineRenderer(renderer); uiOverlay = new UiOverlay(spriteRenderer); palette = new HardwarePalette(renderer, world.Map); diff --git a/OpenRA.Game/Traits/World/BibLayer.cs b/OpenRA.Game/Traits/World/BibLayer.cs index a98a480cb4..6de9f94ffa 100644 --- a/OpenRA.Game/Traits/World/BibLayer.cs +++ b/OpenRA.Game/Traits/World/BibLayer.cs @@ -44,7 +44,7 @@ namespace OpenRA.Traits public BibLayer(Actor self, BibLayerInfo info) { - spriteRenderer = new SpriteRenderer( Game.renderer ); + spriteRenderer = Game.renderer.SpriteRenderer; this.info = info; bibSprites = info.BibTypes.Select(x => SpriteSheetBuilder.LoadAllSprites(x)).ToArray(); diff --git a/OpenRA.Game/Traits/World/ResourceLayer.cs b/OpenRA.Game/Traits/World/ResourceLayer.cs index 35f21650cd..d413890d4e 100644 --- a/OpenRA.Game/Traits/World/ResourceLayer.cs +++ b/OpenRA.Game/Traits/World/ResourceLayer.cs @@ -39,7 +39,7 @@ namespace OpenRA.Traits public ResourceLayer(Actor self) { - sr = new SpriteRenderer( Game.renderer ); + sr = Game.renderer.SpriteRenderer; } public void Render() diff --git a/OpenRA.Game/Traits/World/SmudgeLayer.cs b/OpenRA.Game/Traits/World/SmudgeLayer.cs index 960915c7a2..3922e6b3f8 100644 --- a/OpenRA.Game/Traits/World/SmudgeLayer.cs +++ b/OpenRA.Game/Traits/World/SmudgeLayer.cs @@ -44,7 +44,7 @@ namespace OpenRA.Traits public SmudgeLayer(Actor self, SmudgeLayerInfo info) { - spriteRenderer = new SpriteRenderer( Game.renderer ); + spriteRenderer = Game.renderer.SpriteRenderer; this.Info = info; smudgeSprites = Info.Types.Select(x => SpriteSheetBuilder.LoadAllSprites(x)).ToArray(); } diff --git a/OpenRA.Game/Widgets/ButtonWidget.cs b/OpenRA.Game/Widgets/ButtonWidget.cs index f7591f6647..b8a3ea63cb 100644 --- a/OpenRA.Game/Widgets/ButtonWidget.cs +++ b/OpenRA.Game/Widgets/ButtonWidget.cs @@ -71,7 +71,7 @@ namespace OpenRA.Widgets var stateOffset = (Depressed) ? new int2(VisualHeight, VisualHeight) : new int2(0, 0); WidgetUtils.DrawPanel(Depressed ? "dialog3" : "dialog2", Bounds, - () => Game.chrome.renderer.BoldFont.DrawText(Game.chrome.rgbaRenderer, Text, + () => Game.chrome.renderer.BoldFont.DrawText(Text, new int2(Bounds.X + Bounds.Width / 2, Bounds.Y + Bounds.Height / 2) - new int2(Game.chrome.renderer.BoldFont.Measure(Text).X / 2, Game.chrome.renderer.BoldFont.Measure(Text).Y / 2) + stateOffset, Color.White)); diff --git a/OpenRA.Game/Widgets/CheckboxWidget.cs b/OpenRA.Game/Widgets/CheckboxWidget.cs index 1d36ef4337..64f204f06d 100644 --- a/OpenRA.Game/Widgets/CheckboxWidget.cs +++ b/OpenRA.Game/Widgets/CheckboxWidget.cs @@ -41,7 +41,7 @@ namespace OpenRA.Widgets new Size(Bounds.Height, Bounds.Height)), () => { }); - Game.chrome.renderer.BoldFont.DrawText(Game.chrome.rgbaRenderer, Text, + Game.chrome.renderer.BoldFont.DrawText(Text, new float2(Bounds.Left + Bounds.Height * 2, Bounds.Top), Color.White); if (Checked()) @@ -56,7 +56,7 @@ namespace OpenRA.Widgets Game.chrome.lineRenderer.Flush(); } - Game.chrome.rgbaRenderer.Flush(); + Game.chrome.renderer.RgbaSpriteRenderer.Flush(); base.Draw(world); } diff --git a/OpenRA.Game/Widgets/LabelWidget.cs b/OpenRA.Game/Widgets/LabelWidget.cs index c8aedbb3ca..1e8236e99f 100644 --- a/OpenRA.Game/Widgets/LabelWidget.cs +++ b/OpenRA.Game/Widgets/LabelWidget.cs @@ -55,8 +55,8 @@ namespace OpenRA.Widgets position = new int2(Bounds.X+Bounds.Width/2, Bounds.Y+Bounds.Height/2) - new int2(textSize.X / 2, textSize.Y/2); - font.DrawText(Game.chrome.rgbaRenderer, text, position, Color.White); - Game.chrome.rgbaRenderer.Flush(); + font.DrawText(text, position, Color.White); + Game.chrome.renderer.RgbaSpriteRenderer.Flush(); Game.chrome.renderer.Device.DisableScissor(); base.Draw(world); } diff --git a/OpenRA.Game/Widgets/SpecialPowerBinWidget.cs b/OpenRA.Game/Widgets/SpecialPowerBinWidget.cs index 12915c04f5..a86df0af08 100644 --- a/OpenRA.Game/Widgets/SpecialPowerBinWidget.cs +++ b/OpenRA.Game/Widgets/SpecialPowerBinWidget.cs @@ -94,7 +94,7 @@ namespace OpenRA.Widgets for (var i = 1; i < numPowers; i++) WidgetUtils.DrawRGBA(WidgetUtils.GetChromeImage(world,"specialbin-middle"), new float2(Bounds.X, Bounds.Y + i * 51)); WidgetUtils.DrawRGBA(WidgetUtils.GetChromeImage(world,"specialbin-bottom"), new float2(Bounds.X, Bounds.Y + numPowers * 51)); - Game.chrome.rgbaRenderer.Flush(); + Game.chrome.renderer.RgbaSpriteRenderer.Flush(); // Hack Hack Hack Bounds.Width = 69; @@ -126,19 +126,19 @@ namespace OpenRA.Widgets WidgetUtils.DrawRightTooltip("dialog4", tl, m, br, null); pos += new int2(77, 5); - Game.chrome.renderer.BoldFont.DrawText(Game.chrome.rgbaRenderer, sp.Info.Description, pos, Color.White); + Game.chrome.renderer.BoldFont.DrawText(sp.Info.Description, pos, Color.White); pos += new int2(0,20); - Game.chrome.renderer.BoldFont.DrawText(Game.chrome.rgbaRenderer, FormatTime(sp.RemainingTime).ToString(), pos, Color.White); - Game.chrome.renderer.BoldFont.DrawText(Game.chrome.rgbaRenderer, "/ {0}".F(FormatTime(sp.TotalTime)), pos + new int2(45,0), Color.White); + Game.chrome.renderer.BoldFont.DrawText(FormatTime(sp.RemainingTime).ToString(), pos, Color.White); + Game.chrome.renderer.BoldFont.DrawText("/ {0}".F(FormatTime(sp.TotalTime)), pos + new int2(45,0), Color.White); if (sp.Info.LongDesc != null) { pos += new int2(0, 20); - Game.chrome.renderer.RegularFont.DrawText(Game.chrome.rgbaRenderer, sp.Info.LongDesc.Replace("\\n", "\n"), pos, Color.White); + Game.chrome.renderer.RegularFont.DrawText(sp.Info.LongDesc.Replace("\\n", "\n"), pos, Color.White); } - Game.chrome.rgbaRenderer.Flush(); + Game.chrome.renderer.RgbaSpriteRenderer.Flush(); } WidgetUtils.DrawSHP(image, drawPos); @@ -161,7 +161,7 @@ namespace OpenRA.Widgets y += 51; } } - Game.chrome.shpRenderer.Flush(); + Game.chrome.renderer.WorldSpriteRenderer.Flush(); base.Draw(world); } diff --git a/OpenRA.Game/Widgets/WidgetUtils.cs b/OpenRA.Game/Widgets/WidgetUtils.cs index 078d4c9dde..441284fb2d 100644 --- a/OpenRA.Game/Widgets/WidgetUtils.cs +++ b/OpenRA.Game/Widgets/WidgetUtils.cs @@ -35,12 +35,12 @@ namespace OpenRA.Widgets public static void DrawRGBA(Sprite s, float2 pos) { - Game.chrome.rgbaRenderer.DrawSprite(s,pos,"chrome"); + Game.chrome.renderer.RgbaSpriteRenderer.DrawSprite(s,pos,"chrome"); } public static void DrawSHP(Sprite s, float2 pos) { - Game.chrome.shpRenderer.DrawSprite(s,pos,"chrome"); + Game.chrome.renderer.RgbaSpriteRenderer.DrawSprite(s,pos,"chrome"); } public static void DrawPanel(string collection, Rectangle Bounds, Action a) @@ -89,7 +89,7 @@ namespace OpenRA.Widgets DrawRGBA(ss[7], new float2(Bounds.Right - ss[7].size.X, Bounds.Bottom - ss[7].size.Y)); if (a != null) a(); - Game.chrome.rgbaRenderer.Flush(); + Game.chrome.renderer.RgbaSpriteRenderer.Flush(); } public static void FillRectWithSprite(Rectangle r, Sprite s) @@ -191,7 +191,7 @@ namespace OpenRA.Widgets DrawRGBA(ss[7], new float2(br.X - (int)ss[7].size.X, br.Y - (int)ss[7].size.Y)); if (a != null) a(); - Game.chrome.rgbaRenderer.Flush(); + Game.chrome.renderer.RgbaSpriteRenderer.Flush(); } } }