diff --git a/OpenRa.Game/Chrome.cs b/OpenRa.Game/Chrome.cs index 96a7e8301e..2196a243ae 100644 --- a/OpenRa.Game/Chrome.cs +++ b/OpenRa.Game/Chrome.cs @@ -109,7 +109,7 @@ namespace OpenRa }; panelSprites = Graphics.Util.MakeArray(8, - n => SequenceProvider.GetImageFromCollection(renderer, "panel", n.ToString())); + n => ChromeProvider.GetImage(renderer, "panel", n.ToString())); tabSprites = Rules.ActorInfo.Values .Where(u => u.Traits.Contains()) @@ -168,7 +168,7 @@ namespace OpenRa DrawRadar(); DrawPower(); - rgbaRenderer.DrawSprite(SequenceProvider.GetImageFromCollection(renderer, chromeCollection, "moneybin"), new float2(Game.viewport.Width - 320, 0), PaletteType.Chrome); + rgbaRenderer.DrawSprite(ChromeProvider.GetImage(renderer, chromeCollection, "moneybin"), new float2(Game.viewport.Width - 320, 0), PaletteType.Chrome); DrawMoney(); rgbaRenderer.Flush(); DrawButtons(); @@ -316,12 +316,12 @@ namespace OpenRa hasRadar = hasNewRadar; - rgbaRenderer.DrawSprite(SequenceProvider.GetImageFromCollection(renderer, radarCollection, "left"), radarOrigin, PaletteType.Chrome); - rgbaRenderer.DrawSprite(SequenceProvider.GetImageFromCollection(renderer, radarCollection, "right"), radarOrigin + new float2(201, 0), PaletteType.Chrome); - rgbaRenderer.DrawSprite(SequenceProvider.GetImageFromCollection(renderer, radarCollection, "bottom"), radarOrigin + new float2(0, 192), PaletteType.Chrome); + rgbaRenderer.DrawSprite(ChromeProvider.GetImage(renderer, radarCollection, "left"), radarOrigin, PaletteType.Chrome); + rgbaRenderer.DrawSprite(ChromeProvider.GetImage(renderer, radarCollection, "right"), radarOrigin + new float2(201, 0), PaletteType.Chrome); + rgbaRenderer.DrawSprite(ChromeProvider.GetImage(renderer, radarCollection, "bottom"), radarOrigin + new float2(0, 192), PaletteType.Chrome); if (radarAnimating) - rgbaRenderer.DrawSprite(SequenceProvider.GetImageFromCollection(renderer, radarCollection, "bg"), radarOrigin + new float2(9, 0), PaletteType.Chrome); + rgbaRenderer.DrawSprite(ChromeProvider.GetImage(renderer, radarCollection, "bg"), radarOrigin + new float2(9, 0), PaletteType.Chrome); rgbaRenderer.Flush(); @@ -358,7 +358,7 @@ namespace OpenRa var producing = queue.CurrentItem(groupName); var index = q.Key == currentTab ? 2 : (producing != null && producing.Done) ? 1 : 0; var race = (Game.LocalPlayer.Race == Race.Allies) ? "allies" : "soviet"; - rgbaRenderer.DrawSprite(SequenceProvider.GetImageFromCollection(renderer,"tabs-"+tabKeys[index], race+"-"+q.Key), new float2(x, y), PaletteType.Chrome); + rgbaRenderer.DrawSprite(ChromeProvider.GetImage(renderer,"tabs-"+tabKeys[index], race+"-"+q.Key), new float2(x, y), PaletteType.Chrome); buttons.Add(Pair.New(new RectangleF(x, y, tabWidth, tabHeight), (Action)(isLmb => HandleTabClick(groupName)))); @@ -397,7 +397,7 @@ namespace OpenRa var x = Game.viewport.Width - 65; foreach (var d in moneyDigits.Reverse()) { - rgbaRenderer.DrawSprite(SequenceProvider.GetImageFromCollection(renderer, digitCollection, (d - '0').ToString()), new float2(x, 6), PaletteType.Chrome); + rgbaRenderer.DrawSprite(ChromeProvider.GetImage(renderer, digitCollection, (d - '0').ToString()), new float2(x, 6), PaletteType.Chrome); x -= 14; } } @@ -447,7 +447,7 @@ namespace OpenRa lineRenderer.Flush(); // Power usage indicator - var indicator = SequenceProvider.GetImageFromCollection(renderer, radarCollection, "power-indicator"); + var indicator = ChromeProvider.GetImage(renderer, radarCollection, "power-indicator"); var powerDrainedTemp = barStart.X + (barEnd.X - barStart.X) * (Game.LocalPlayer.PowerDrained / powerScaleBy); lastPowerDrainedPos = float2.Lerp(lastPowerDrainedPos.GetValueOrDefault(powerDrainedTemp), powerDrainedTemp, .3f); float2 powerDrainLevel = new float2(lastPowerDrainedPos.Value-indicator.size.X/2, barStart.Y-1); @@ -655,7 +655,7 @@ namespace OpenRa string tooltipItem = null; // Draw the top border - rgbaRenderer.DrawSprite(SequenceProvider.GetImageFromCollection(renderer, paletteCollection, "top"), new float2(origin.X - 9, origin.Y - 9), PaletteType.Chrome); + rgbaRenderer.DrawSprite(ChromeProvider.GetImage(renderer, paletteCollection, "top"), new float2(origin.X - 9, origin.Y - 9), PaletteType.Chrome); // Draw the icons int lasty = -1; @@ -664,7 +664,7 @@ namespace OpenRa // Draw the background for this row if (y != lasty) { - rgbaRenderer.DrawSprite(SequenceProvider.GetImageFromCollection(renderer, paletteCollection, "bg-" + (y % 4).ToString()), new float2(origin.X - 9, origin.Y + 48 * y), PaletteType.Chrome); + rgbaRenderer.DrawSprite(ChromeProvider.GetImage(renderer, paletteCollection, "bg-" + (y % 4).ToString()), new float2(origin.X - 9, origin.Y + 48 * y), PaletteType.Chrome); rgbaRenderer.Flush(); lasty = y; } @@ -731,7 +731,7 @@ namespace OpenRa while (y < paletteRows) { - rgbaRenderer.DrawSprite(SequenceProvider.GetImageFromCollection(renderer, paletteCollection, "bg-" + (y % 4).ToString()), new float2(origin.X - 9, origin.Y + 48 * y), PaletteType.Chrome); + rgbaRenderer.DrawSprite(ChromeProvider.GetImage(renderer, paletteCollection, "bg-" + (y % 4).ToString()), new float2(origin.X - 9, origin.Y + 48 * y), PaletteType.Chrome); y++; } @@ -739,15 +739,15 @@ namespace OpenRa shpRenderer.DrawSprite(ob.First, ob.Second, PaletteType.Chrome); shpRenderer.Flush(); - rgbaRenderer.DrawSprite(SequenceProvider.GetImageFromCollection(renderer, paletteCollection, "bottom"), new float2(origin.X - 9, origin.Y - 1 + 48 * y), PaletteType.Chrome); + rgbaRenderer.DrawSprite(ChromeProvider.GetImage(renderer, paletteCollection, "bottom"), new float2(origin.X - 9, origin.Y - 1 + 48 * y), PaletteType.Chrome); // Draw dock - rgbaRenderer.DrawSprite(SequenceProvider.GetImageFromCollection(renderer, paletteCollection, "dock-top"), new float2(Game.viewport.Width - 14, origin.Y - 23), PaletteType.Chrome); + rgbaRenderer.DrawSprite(ChromeProvider.GetImage(renderer, paletteCollection, "dock-top"), new float2(Game.viewport.Width - 14, origin.Y - 23), PaletteType.Chrome); for (int i = 0; i < y; i++) { - rgbaRenderer.DrawSprite(SequenceProvider.GetImageFromCollection(renderer, paletteCollection, "dock-" + (y % 4).ToString()), new float2(Game.viewport.Width - 14, origin.Y + 48 * i), PaletteType.Chrome); + rgbaRenderer.DrawSprite(ChromeProvider.GetImage(renderer, paletteCollection, "dock-" + (y % 4).ToString()), new float2(Game.viewport.Width - 14, origin.Y + 48 * i), PaletteType.Chrome); } - rgbaRenderer.DrawSprite(SequenceProvider.GetImageFromCollection(renderer, paletteCollection, "dock-bottom"), new float2(Game.viewport.Width - 14, origin.Y - 1 + 48 * y), PaletteType.Chrome); + rgbaRenderer.DrawSprite(ChromeProvider.GetImage(renderer, paletteCollection, "dock-bottom"), new float2(Game.viewport.Width - 14, origin.Y - 1 + 48 * y), PaletteType.Chrome); rgbaRenderer.Flush(); if (tooltipItem != null) @@ -846,7 +846,7 @@ namespace OpenRa void DrawProductionTooltip(string unit, int2 pos) { - var tooltipSprite = SequenceProvider.GetImageFromCollection(renderer, chromeCollection, "tooltip-bg"); + var tooltipSprite = ChromeProvider.GetImage(renderer, chromeCollection, "tooltip-bg"); var p = pos.ToFloat2() - new float2(tooltipSprite.size.X, 0); rgbaRenderer.DrawSprite(tooltipSprite, p, PaletteType.Chrome); rgbaRenderer.Flush(); @@ -898,10 +898,10 @@ namespace OpenRa if (numPowers == 0) return; - rgbaRenderer.DrawSprite(SequenceProvider.GetImageFromCollection(renderer, chromeCollection, "specialbin-top"), new float2(0, 14), PaletteType.Chrome); + rgbaRenderer.DrawSprite(ChromeProvider.GetImage(renderer, chromeCollection, "specialbin-top"), new float2(0, 14), PaletteType.Chrome); for (var i = 1; i < numPowers; i++) - rgbaRenderer.DrawSprite(SequenceProvider.GetImageFromCollection(renderer, chromeCollection, "specialbin-middle"), new float2(0, 14 + i * 51), PaletteType.Chrome); - rgbaRenderer.DrawSprite(SequenceProvider.GetImageFromCollection(renderer, chromeCollection, "specialbin-bottom"), new float2(0, 14 + numPowers * 51), PaletteType.Chrome); + rgbaRenderer.DrawSprite(ChromeProvider.GetImage(renderer, chromeCollection, "specialbin-middle"), new float2(0, 14 + i * 51), PaletteType.Chrome); + rgbaRenderer.DrawSprite(ChromeProvider.GetImage(renderer, chromeCollection, "specialbin-bottom"), new float2(0, 14 + numPowers * 51), PaletteType.Chrome); rgbaRenderer.Flush(); @@ -967,7 +967,7 @@ namespace OpenRa void DrawSupportPowerTooltip(string sp, int2 pos) { - var tooltipSprite = SequenceProvider.GetImageFromCollection(renderer, chromeCollection, "tooltip-bg"); + var tooltipSprite = ChromeProvider.GetImage(renderer, chromeCollection, "tooltip-bg"); rgbaRenderer.DrawSprite(tooltipSprite, pos, PaletteType.Chrome); rgbaRenderer.Flush(); diff --git a/OpenRa.Game/Game.cs b/OpenRa.Game/Game.cs index 96e3f572fb..177769af01 100644 --- a/OpenRa.Game/Game.cs +++ b/OpenRa.Game/Game.cs @@ -102,6 +102,8 @@ namespace OpenRa PerfHistory.items["batches"].hasNormalTick = false; Game.controller = controller; + ChromeProvider.Initialize("chrome.xml"); + ChangeMap(mapName); if (Settings.Replay != "") diff --git a/OpenRa.Game/Graphics/ChromeProvider.cs b/OpenRa.Game/Graphics/ChromeProvider.cs new file mode 100644 index 0000000000..e0300093db --- /dev/null +++ b/OpenRa.Game/Graphics/ChromeProvider.cs @@ -0,0 +1,78 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Xml; +using OpenRa.FileFormats; + +namespace OpenRa.Graphics +{ + static class ChromeProvider + { + static Dictionary> collections; + static Dictionary cachedSheets; + static Dictionary> cachedSprites; + + public static void Initialize(params string[] chromeFiles) + { + collections = new Dictionary>(); + cachedSheets = new Dictionary(); + cachedSprites = new Dictionary>(); + + foreach (var f in chromeFiles) + LoadChromeSource(f); + } + + static void LoadChromeSource(string filename) + { + XmlDocument document = new XmlDocument(); + document.Load(FileSystem.Open(filename)); + foreach (XmlElement eCollection in document.SelectNodes("/chrome/collection")) + LoadChromeForCollection(eCollection); + } + + static void LoadChromeForCollection(XmlElement eCollection) + { + string elementName = eCollection.GetAttribute("name"); + string defaultSrc = (eCollection.HasAttribute("src") ? eCollection.GetAttribute("src") : null); + + var images = eCollection.SelectNodes("./image").OfType() + .Select(e => new MappedImage(defaultSrc, e)) + .ToDictionary(s => s.Name); + + collections.Add(elementName, images); + } + + public static Sprite GetImage(Renderer renderer, string collection, string image) + { + // Cached sprite + if (cachedSprites.ContainsKey(collection) && cachedSprites[collection].ContainsKey(image)) + return cachedSprites[collection][image]; + + MappedImage mi; + try { mi = collections[collection][image]; } + catch (KeyNotFoundException) + { + throw new InvalidOperationException( + "Collection `{0}` does not have an image `{1}`".F(collection, image)); + } + + // Cached sheet + Sheet sheet; + if (cachedSheets.ContainsKey(mi.Src)) + sheet = cachedSheets[mi.Src]; + else + { + sheet = new Sheet(renderer, mi.Src); + cachedSheets.Add(mi.Src, sheet); + } + + // Cache the sprite + if (!cachedSprites.ContainsKey(collection)) + cachedSprites.Add(collection, new Dictionary()); + cachedSprites[collection].Add(image, mi.GetImage(renderer, sheet)); + + return cachedSprites[collection][image]; + } + } +} diff --git a/OpenRa.Game/Graphics/SequenceProvider.cs b/OpenRa.Game/Graphics/SequenceProvider.cs index 64e0ab4e1f..059260d306 100644 --- a/OpenRa.Game/Graphics/SequenceProvider.cs +++ b/OpenRa.Game/Graphics/SequenceProvider.cs @@ -10,25 +10,15 @@ namespace OpenRa.Graphics { static Dictionary> units; static Dictionary cursors; - - static Dictionary> collections; - static Dictionary cachedSheets; - static Dictionary> cachedSprites; - - public static void Initialize( bool useAftermath ) + + public static void Initialize(bool useAftermath) { units = new Dictionary>(); cursors = new Dictionary(); - collections = new Dictionary>(); - cachedSheets = new Dictionary(); - cachedSprites = new Dictionary>(); - LoadSequenceSource("sequences.xml"); if (useAftermath) LoadSequenceSource("sequences-aftermath.xml"); - - LoadChromeSource("chrome.xml"); } static void LoadSequenceSource(string filename) @@ -42,27 +32,7 @@ namespace OpenRa.Graphics foreach (XmlElement eCursor in document.SelectNodes("/sequences/cursor")) LoadSequencesForCursor(eCursor); } - - static void LoadChromeSource(string filename) - { - XmlDocument document = new XmlDocument(); - document.Load(FileSystem.Open(filename)); - foreach (XmlElement eCollection in document.SelectNodes("/chrome/collection")) - LoadChromeForCollection(eCollection); - } - static void LoadChromeForCollection(XmlElement eCollection) - { - string elementName = eCollection.GetAttribute("name"); - string defaultSrc = (eCollection.HasAttribute("src") ? eCollection.GetAttribute("src") : null); - - var images = eCollection.SelectNodes("./image").OfType() - .Select(e => new MappedImage(defaultSrc, e)) - .ToDictionary(s => s.Name); - - collections.Add(elementName, images); - } - static void LoadSequencesForCursor(XmlElement eCursor) { string cursorSrc = eCursor.GetAttribute("src"); @@ -103,38 +73,5 @@ namespace OpenRa.Graphics { return cursors[cursor]; } - - - public static Sprite GetImageFromCollection(Renderer renderer,string collection, string image) - { - // Cached sprite - if (cachedSprites.ContainsKey(collection) && cachedSprites[collection].ContainsKey(image)) - return cachedSprites[collection][image]; - - MappedImage mi; - try { mi = collections[collection][image];} - catch (KeyNotFoundException) - { - throw new InvalidOperationException( - "Collection `{0}` does not have an image `{1}`".F(collection, image)); - } - - // Cached sheet - Sheet sheet; - if (cachedSheets.ContainsKey(mi.Src)) - sheet = cachedSheets[mi.Src]; - else - { - sheet = new Sheet(renderer, mi.Src); - cachedSheets.Add(mi.Src, sheet); - } - - // Cache the sprite - if (!cachedSprites.ContainsKey(collection)) - cachedSprites.Add(collection, new Dictionary()); - cachedSprites[collection].Add(image, mi.GetImage(renderer, sheet)); - - return cachedSprites[collection][image]; - } } } diff --git a/OpenRa.Game/OpenRa.Game.csproj b/OpenRa.Game/OpenRa.Game.csproj index eb43a104a6..4a08e782e9 100644 --- a/OpenRa.Game/OpenRa.Game.csproj +++ b/OpenRa.Game/OpenRa.Game.csproj @@ -98,6 +98,7 @@ +