diff --git a/OpenRA.Game/Graphics/CursorProvider.cs b/OpenRA.Game/Graphics/CursorProvider.cs index 823e231c41..cffd64422f 100644 --- a/OpenRA.Game/Graphics/CursorProvider.cs +++ b/OpenRA.Game/Graphics/CursorProvider.cs @@ -14,12 +14,14 @@ using System.IO; using System.Linq; using System.Xml; using OpenRA.FileFormats; +using OpenRA.Traits; namespace OpenRA.Graphics { public static class CursorProvider { public static Dictionary Palettes { get; private set; } + public static HardwarePalette Palette; static Dictionary cursors; public static void Initialize(string[] sequenceFiles) @@ -38,6 +40,13 @@ namespace OpenRA.Graphics foreach (var s in sequences.NodesDict["Palettes"].Nodes) Palettes.Add(s.Key, new Palette(FileSystem.Open(s.Value.Value), ShadowIndex)); + Palette = new HardwarePalette(); + foreach (var p in CursorProvider.Palettes) + Palette.AddPalette(p.Key, p.Value, false); + + // Generate initial palette texture + Palette.Update(new IPaletteModifier[] {}); + foreach (var s in sequences.NodesDict["Cursors"].Nodes) LoadSequencesForCursor(s.Key, s.Value); } @@ -55,6 +64,17 @@ namespace OpenRA.Graphics return cursors.ContainsKey(cursor); } + public static void DrawCursor(Renderer renderer, string cursorName, int2 lastMousePos, int cursorFrame) + { + var cursorSequence = CursorProvider.GetCursorSequence(cursorName); + var cursorSprite = cursorSequence.GetSprite(cursorFrame); + + renderer.SpriteRenderer.DrawSprite(cursorSprite, + lastMousePos - cursorSequence.Hotspot, + Palette.GetPaletteIndex(cursorSequence.Palette), + cursorSprite.size); + } + public static CursorSequence GetCursorSequence(string cursor) { try { return cursors[cursor]; } diff --git a/OpenRA.Game/Graphics/Viewport.cs b/OpenRA.Game/Graphics/Viewport.cs index 48b41a3c0e..af87f627ed 100755 --- a/OpenRA.Game/Graphics/Viewport.cs +++ b/OpenRA.Game/Graphics/Viewport.cs @@ -127,18 +127,9 @@ namespace OpenRA.Graphics using( new PerfSample("render_widgets") ) { Ui.Draw(); + var cursorName = Ui.Root.GetCursorOuter(Viewport.LastMousePos) ?? "default"; - var cursorSequence = CursorProvider.GetCursorSequence(cursorName); - var cursorSprite = cursorSequence.GetSprite((int)cursorFrame); - - var palette = new HardwarePalette(); - foreach (var p in CursorProvider.Palettes) - palette.AddPalette(p.Key, p.Value, false); - - renderer.SpriteRenderer.DrawSprite(cursorSprite, - Viewport.LastMousePos - cursorSequence.Hotspot, - palette.GetPaletteIndex(cursorSequence.Palette), - cursorSprite.size); + CursorProvider.DrawCursor(renderer, cursorName, Viewport.LastMousePos, (int)cursorFrame); } using( new PerfSample("render_flip") ) diff --git a/OpenRA.Game/Graphics/WorldRenderer.cs b/OpenRA.Game/Graphics/WorldRenderer.cs index fca66abb50..ebbb1ed0f3 100644 --- a/OpenRA.Game/Graphics/WorldRenderer.cs +++ b/OpenRA.Game/Graphics/WorldRenderer.cs @@ -41,17 +41,12 @@ namespace OpenRA.Graphics internal WorldRenderer(World world) { this.world = world; - palette = new HardwarePalette(); - foreach (var p in CursorProvider.Palettes) - palette.AddPalette(p.Key, p.Value, false); + palette = CursorProvider.Palette; palettes = new Cache(CreatePaletteReference); foreach (var pal in world.traitDict.ActorsWithTraitMultiple(world)) pal.Trait.InitPalette( this ); - // Generate initial palette texture - palette.Update(new IPaletteModifier[] {}); - terrainRenderer = new TerrainRenderer(world, this); shroudRenderer = new ShroudRenderer(world); }