From 227a7a61eba5e7a46b3e01af42ce5f2d89d70e94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Mail=C3=A4nder?= Date: Sun, 24 Mar 2013 15:16:49 +0100 Subject: [PATCH 1/3] don't crash when trying to get the game assets on first start wr is null at that stage --- OpenRA.Game/Graphics/Viewport.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/OpenRA.Game/Graphics/Viewport.cs b/OpenRA.Game/Graphics/Viewport.cs index 4a15d081ac..48b41a3c0e 100755 --- a/OpenRA.Game/Graphics/Viewport.cs +++ b/OpenRA.Game/Graphics/Viewport.cs @@ -131,9 +131,13 @@ namespace OpenRA.Graphics 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, - wr.Palette(cursorSequence.Palette).Index, + palette.GetPaletteIndex(cursorSequence.Palette), cursorSprite.size); } From ba12aafd78e45ed5086cb8f3c03802999f5f0950 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Mail=C3=A4nder?= Date: Sun, 24 Mar 2013 21:21:30 +0100 Subject: [PATCH 2/3] refactor cursor rendering create a new cursor palette only once and not in WorldRenderer move cusrsor sequence lookup and drawing to CursorProvider --- OpenRA.Game/Graphics/CursorProvider.cs | 20 ++++++++++++++++++++ OpenRA.Game/Graphics/Viewport.cs | 13 ++----------- OpenRA.Game/Graphics/WorldRenderer.cs | 7 +------ 3 files changed, 23 insertions(+), 17 deletions(-) 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); } From 851512a84e937b98aadf5eeac31b0d42c5d3b05a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Mail=C3=A4nder?= Date: Sun, 24 Mar 2013 22:02:45 +0100 Subject: [PATCH 3/3] eliminate public CursorProvider.Palettes don't hand over the cursor palette to the world renderer at all still update worldrender palette (set and apply modifiers) --- OpenRA.Game/Graphics/CursorProvider.cs | 7 +++---- OpenRA.Game/Graphics/WorldRenderer.cs | 5 ++++- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/OpenRA.Game/Graphics/CursorProvider.cs b/OpenRA.Game/Graphics/CursorProvider.cs index cffd64422f..0896b21be9 100644 --- a/OpenRA.Game/Graphics/CursorProvider.cs +++ b/OpenRA.Game/Graphics/CursorProvider.cs @@ -20,7 +20,6 @@ namespace OpenRA.Graphics { public static class CursorProvider { - public static Dictionary Palettes { get; private set; } public static HardwarePalette Palette; static Dictionary cursors; @@ -36,12 +35,12 @@ namespace OpenRA.Graphics ShadowIndex[ShadowIndex.Length - 1] = Convert.ToInt32(sequences.NodesDict["ShadowIndex"].Value); } - Palettes = new Dictionary(); + var palettes = new Dictionary(); foreach (var s in sequences.NodesDict["Palettes"].Nodes) - Palettes.Add(s.Key, new Palette(FileSystem.Open(s.Value.Value), ShadowIndex)); + palettes.Add(s.Key, new Palette(FileSystem.Open(s.Value.Value), ShadowIndex)); Palette = new HardwarePalette(); - foreach (var p in CursorProvider.Palettes) + foreach (var p in palettes) Palette.AddPalette(p.Key, p.Value, false); // Generate initial palette texture diff --git a/OpenRA.Game/Graphics/WorldRenderer.cs b/OpenRA.Game/Graphics/WorldRenderer.cs index ebbb1ed0f3..830b80acb7 100644 --- a/OpenRA.Game/Graphics/WorldRenderer.cs +++ b/OpenRA.Game/Graphics/WorldRenderer.cs @@ -41,12 +41,15 @@ namespace OpenRA.Graphics internal WorldRenderer(World world) { this.world = world; - palette = CursorProvider.Palette; + palette = new HardwarePalette(); 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); }