diff --git a/OpenRA.Game/Graphics/CursorProvider.cs b/OpenRA.Game/Graphics/CursorProvider.cs index 4ea40508e0..79e4db3966 100644 --- a/OpenRA.Game/Graphics/CursorProvider.cs +++ b/OpenRA.Game/Graphics/CursorProvider.cs @@ -20,12 +20,23 @@ namespace OpenRA.Graphics { public static class CursorProvider { - static HardwarePalette Palette; + static HardwarePalette palette; static Dictionary cursors; + static Cache palettes; + + static PaletteReference CreatePaletteReference(string name) + { + var pal = palette.GetPalette(name); + if (pal == null) + throw new InvalidOperationException("Palette `{0}` does not exist".F(name)); + + return new PaletteReference(name, palette.GetPaletteIndex(name), pal); + } public static void Initialize(string[] sequenceFiles) { cursors = new Dictionary(); + palettes = new Cache(CreatePaletteReference); var sequences = new MiniYaml(null, sequenceFiles.Select(s => MiniYaml.FromFile(s)).Aggregate(MiniYaml.MergeLiberal)); int[] ShadowIndex = { }; @@ -35,14 +46,14 @@ namespace OpenRA.Graphics int.TryParse(sequences.NodesDict["ShadowIndex"].Value, out ShadowIndex[ShadowIndex.Length - 1]); } - Palette = new HardwarePalette(); + palette = new HardwarePalette(); foreach (var p in sequences.NodesDict["Palettes"].Nodes) - Palette.AddPalette(p.Key, new Palette(FileSystem.Open(p.Value.Value), ShadowIndex), false); + palette.AddPalette(p.Key, new Palette(FileSystem.Open(p.Value.Value), ShadowIndex), false); foreach (var s in sequences.NodesDict["Cursors"].Nodes) LoadSequencesForCursor(s.Key, s.Value); - Palette.Initialize(); + palette.Initialize(); } static void LoadSequencesForCursor(string cursorSrc, MiniYaml cursor) @@ -63,10 +74,10 @@ namespace OpenRA.Graphics var cursorSequence = GetCursorSequence(cursorName); var cursorSprite = cursorSequence.GetSprite(cursorFrame); - renderer.SetPalette(Palette); + renderer.SetPalette(palette); renderer.SpriteRenderer.DrawSprite(cursorSprite, lastMousePos - cursorSequence.Hotspot, - Palette.GetPaletteIndex(cursorSequence.Palette), + palettes[cursorSequence.Palette], cursorSprite.size); } diff --git a/OpenRA.Game/Graphics/Renderable.cs b/OpenRA.Game/Graphics/Renderable.cs index a3ec62dbd6..fcc264e399 100644 --- a/OpenRA.Game/Graphics/Renderable.cs +++ b/OpenRA.Game/Graphics/Renderable.cs @@ -82,7 +82,7 @@ namespace OpenRA.Graphics public void Render(WorldRenderer wr) { - sprite.DrawAt(wr.ScreenPxPosition(pos) - pxCenter, palette.Index, scale); + sprite.DrawAt(wr.ScreenPxPosition(pos) - pxCenter, palette, scale); } public void RenderDebugGeometry(WorldRenderer wr) diff --git a/OpenRA.Game/Graphics/ShroudRenderer.cs b/OpenRA.Game/Graphics/ShroudRenderer.cs index 7abb76ffae..3a8358ae2f 100644 --- a/OpenRA.Game/Graphics/ShroudRenderer.cs +++ b/OpenRA.Game/Graphics/ShroudRenderer.cs @@ -185,14 +185,14 @@ namespace OpenRA.Graphics { s[starti, j].DrawAt( Game.CellSize * new float2(starti, j), - pal.Index, + pal, new float2(Game.CellSize * (i - starti), Game.CellSize)); starti = i + 1; } s[i, j].DrawAt( Game.CellSize * new float2(i, j), - pal.Index); + pal); starti = i + 1; last = s[i, j]; } @@ -200,7 +200,7 @@ namespace OpenRA.Graphics if (starti < clip.Right) s[starti, j].DrawAt( Game.CellSize * new float2(starti, j), - pal.Index, + pal, new float2(Game.CellSize * (clip.Right - starti), Game.CellSize)); } } diff --git a/OpenRA.Game/Graphics/Sprite.cs b/OpenRA.Game/Graphics/Sprite.cs index fca0632536..7296bbb25c 100644 --- a/OpenRA.Game/Graphics/Sprite.cs +++ b/OpenRA.Game/Graphics/Sprite.cs @@ -50,24 +50,19 @@ namespace OpenRA.Graphics return textureCoords[k]; } - public void DrawAt(WorldRenderer wr, float2 location, string palette) + public void DrawAt(float2 location, PaletteReference pal) { - Game.Renderer.WorldSpriteRenderer.DrawSprite(this, location, wr, palette, size); + Game.Renderer.WorldSpriteRenderer.DrawSprite(this, location, pal, size); } - public void DrawAt(float2 location, int paletteIndex) + public void DrawAt(float2 location, PaletteReference pal, float scale) { - Game.Renderer.WorldSpriteRenderer.DrawSprite(this, location, paletteIndex, size); + Game.Renderer.WorldSpriteRenderer.DrawSprite(this, location, pal, size*scale); } - public void DrawAt(float2 location, int paletteIndex, float scale) + public void DrawAt(float2 location, PaletteReference pal, float2 size) { - Game.Renderer.WorldSpriteRenderer.DrawSprite(this, location, paletteIndex, size*scale); - } - - public void DrawAt(float2 location, int paletteIndex, float2 size) - { - Game.Renderer.WorldSpriteRenderer.DrawSprite(this, location, paletteIndex, size); + Game.Renderer.WorldSpriteRenderer.DrawSprite(this, location, pal, size); } } diff --git a/OpenRA.Game/Graphics/SpriteRenderer.cs b/OpenRA.Game/Graphics/SpriteRenderer.cs index 985f194800..11e1989127 100644 --- a/OpenRA.Game/Graphics/SpriteRenderer.cs +++ b/OpenRA.Game/Graphics/SpriteRenderer.cs @@ -45,17 +45,17 @@ namespace OpenRA.Graphics } } - public void DrawSprite(Sprite s, float2 location, WorldRenderer wr, string palette) + public void DrawSprite(Sprite s, float2 location, PaletteReference pal) { - DrawSprite(s, location, wr.Palette(palette).Index, s.size); + DrawSprite(s, location, pal.Index, s.size); } - public void DrawSprite(Sprite s, float2 location, WorldRenderer wr, string palette, float2 size) + public void DrawSprite(Sprite s, float2 location, PaletteReference pal, float2 size) { - DrawSprite(s, location, wr.Palette(palette).Index, size); + DrawSprite(s, location, pal.Index, size); } - public void DrawSprite(Sprite s, float2 location, int paletteIndex, float2 size) + void DrawSprite(Sprite s, float2 location, int paletteIndex, float2 size) { Renderer.CurrentBatchRenderer = this; diff --git a/OpenRA.Game/Traits/SelectionDecorations.cs b/OpenRA.Game/Traits/SelectionDecorations.cs index ab9293d688..d9981c52b5 100644 --- a/OpenRA.Game/Traits/SelectionDecorations.cs +++ b/OpenRA.Game/Traits/SelectionDecorations.cs @@ -51,7 +51,7 @@ namespace OpenRA.Traits var pipImages = new Animation("pips"); pipImages.PlayFetchIndex("groups", () => (int)group); pipImages.Tick(); - pipImages.Image.DrawAt(wr, basePosition + new float2(-8, 1), "chrome"); + pipImages.Image.DrawAt(basePosition + new float2(-8, 1), wr.Palette("chrome")); } void DrawPips(WorldRenderer wr, Actor self, float2 basePosition) @@ -69,6 +69,7 @@ namespace OpenRA.Traits var pipSize = pipImages.Image.size; var pipxyBase = basePosition + new float2(1, -pipSize.Y); var pipxyOffset = new float2(0, 0); // Correct for offset due to multiple columns/rows + var pal = wr.Palette("chrome"); foreach (var pips in pipSources) { @@ -86,7 +87,7 @@ namespace OpenRA.Traits pipxyOffset.Y -= pipSize.Y; } pipImages.PlayRepeating(pipStrings[(int)pip]); - pipImages.Image.DrawAt(wr, pipxyBase + pipxyOffset, "chrome"); + pipImages.Image.DrawAt(pipxyBase + pipxyOffset, pal); pipxyOffset += new float2(pipSize.X, 0); } @@ -104,7 +105,7 @@ namespace OpenRA.Traits // If a mod wants to implement a unit with multiple tags, then they are placed on multiple rows var tagxyBase = basePosition + new float2(-16, 2); // Correct for the offset in the shp file var tagxyOffset = new float2(0, 0); // Correct for offset due to multiple rows - + var pal = wr.Palette("chrome"); foreach (var tags in self.TraitsImplementing()) { foreach (var tag in tags.GetTags()) @@ -114,7 +115,7 @@ namespace OpenRA.Traits var tagImages = new Animation("pips"); tagImages.PlayRepeating(tagStrings[(int)tag]); - tagImages.Image.DrawAt(wr, tagxyBase + tagxyOffset, "chrome"); + tagImages.Image.DrawAt(tagxyBase + tagxyOffset, pal); // Increment row tagxyOffset.Y += 8; diff --git a/OpenRA.Game/Traits/World/ResourceLayer.cs b/OpenRA.Game/Traits/World/ResourceLayer.cs index 4b10b173fc..59c25462c2 100644 --- a/OpenRA.Game/Traits/World/ResourceLayer.cs +++ b/OpenRA.Game/Traits/World/ResourceLayer.cs @@ -47,7 +47,7 @@ namespace OpenRA.Traits if (c.image != null) c.image[c.density].DrawAt( new CPos(x, y).ToPPos().ToFloat2(), - c.type.info.PaletteRef.Index); + c.type.info.PaletteRef); } } diff --git a/OpenRA.Game/Widgets/ShpImageWidget.cs b/OpenRA.Game/Widgets/ShpImageWidget.cs index 7198598ccb..f7842aa5fa 100644 --- a/OpenRA.Game/Widgets/ShpImageWidget.cs +++ b/OpenRA.Game/Widgets/ShpImageWidget.cs @@ -71,7 +71,7 @@ namespace OpenRA.Widgets cachedFrame = frame; } - Game.Renderer.SpriteRenderer.DrawSprite(sprite, RenderOrigin, worldRenderer, palette); + Game.Renderer.SpriteRenderer.DrawSprite(sprite, RenderOrigin, worldRenderer.Palette(palette)); } public int FrameCount diff --git a/OpenRA.Game/Widgets/WidgetUtils.cs b/OpenRA.Game/Widgets/WidgetUtils.cs index 7120dacc3e..6f3f1ac19f 100644 --- a/OpenRA.Game/Widgets/WidgetUtils.cs +++ b/OpenRA.Game/Widgets/WidgetUtils.cs @@ -31,12 +31,12 @@ namespace OpenRA.Widgets public static void DrawSHP(Sprite s, float2 pos, WorldRenderer wr) { - Game.Renderer.SpriteRenderer.DrawSprite(s,pos, wr, "chrome"); + Game.Renderer.SpriteRenderer.DrawSprite(s, pos, wr.Palette("chrome")); } public static void DrawSHP(Sprite s, float2 pos, WorldRenderer wr, float2 size) { - Game.Renderer.SpriteRenderer.DrawSprite(s, pos, wr, "chrome", size); + Game.Renderer.SpriteRenderer.DrawSprite(s, pos, wr.Palette("chrome"), size); } public static void DrawPanel(string collection, Rectangle Bounds) diff --git a/OpenRA.Mods.RA/Buildings/BibLayer.cs b/OpenRA.Mods.RA/Buildings/BibLayer.cs index d5f33a2243..415a08ae0a 100755 --- a/OpenRA.Mods.RA/Buildings/BibLayer.cs +++ b/OpenRA.Mods.RA/Buildings/BibLayer.cs @@ -73,6 +73,7 @@ namespace OpenRA.Mods.RA.Buildings public void Render( WorldRenderer wr ) { + var pal = wr.Palette("terrain"); var cliprect = Game.viewport.WorldBounds(world); foreach (var kv in tiles) { @@ -81,7 +82,7 @@ namespace OpenRA.Mods.RA.Buildings if (world.ShroudObscures(kv.Key)) continue; - bibSprites[kv.Value.type - 1][kv.Value.index].DrawAt(wr, kv.Key.ToPPos().ToFloat2(), "terrain"); + bibSprites[kv.Value.type - 1][kv.Value.index].DrawAt(kv.Key.ToPPos().ToFloat2(), pal); } } } diff --git a/OpenRA.Mods.RA/Orders/PlaceBuildingOrderGenerator.cs b/OpenRA.Mods.RA/Orders/PlaceBuildingOrderGenerator.cs index 84cb7a52b7..b561ca2dfd 100755 --- a/OpenRA.Mods.RA/Orders/PlaceBuildingOrderGenerator.cs +++ b/OpenRA.Mods.RA/Orders/PlaceBuildingOrderGenerator.cs @@ -108,8 +108,9 @@ namespace OpenRA.Mods.RA.Orders cells.Add(t, isCloseEnough && world.IsCellBuildable(t, BuildingInfo) && res.GetResource(t) == null); } + var pal = wr.Palette("terrain"); foreach (var c in cells) - (c.Value ? buildOk : buildBlocked).DrawAt(wr, c.Key.ToPPos().ToFloat2(), "terrain"); + (c.Value ? buildOk : buildBlocked).DrawAt(c.Key.ToPPos().ToFloat2(), pal); } public string GetCursor(World world, CPos xy, MouseInput mi) { return "default"; } diff --git a/OpenRA.Mods.RA/SupportPowers/ChronoshiftPower.cs b/OpenRA.Mods.RA/SupportPowers/ChronoshiftPower.cs index a6b76c1fc8..7b63802360 100755 --- a/OpenRA.Mods.RA/SupportPowers/ChronoshiftPower.cs +++ b/OpenRA.Mods.RA/SupportPowers/ChronoshiftPower.cs @@ -151,8 +151,9 @@ namespace OpenRA.Mods.RA { var xy = Game.viewport.ViewToWorld(Viewport.LastMousePos); var tiles = world.FindTilesInCircle(xy, range); + var pal = wr.Palette("terrain"); foreach (var t in tiles) - tile.DrawAt( wr, t.ToPPos().ToFloat2(), "terrain" ); + tile.DrawAt(t.ToPPos().ToFloat2(), pal); } public string GetCursor(World world, CPos xy, MouseInput mi) @@ -230,14 +231,15 @@ namespace OpenRA.Mods.RA public void RenderBeforeWorld(WorldRenderer wr, World world) { var xy = Game.viewport.ViewToWorld(Viewport.LastMousePos); + var pal = wr.Palette("terrain"); // Source tiles foreach (var t in world.FindTilesInCircle(sourceLocation, range)) - sourceTile.DrawAt( wr, t.ToPPos().ToFloat2(), "terrain" ); + sourceTile.DrawAt(t.ToPPos().ToFloat2(), pal); // Destination tiles foreach (var t in world.FindTilesInCircle(xy, range)) - sourceTile.DrawAt( wr, t.ToPPos().ToFloat2(), "terrain" ); + sourceTile.DrawAt(t.ToPPos().ToFloat2(), pal); // Unit previews foreach (var unit in power.UnitsInRange(sourceLocation)) @@ -257,7 +259,7 @@ namespace OpenRA.Mods.RA var canEnter = ((manager.self.Owner.Shroud.IsExplored(targetCell) || manager.self.Owner.HasFogVisibility()) && unit.Trait().CanChronoshiftTo(unit,targetCell)); var tile = canEnter ? validTile : invalidTile; - tile.DrawAt(wr, targetCell.ToPPos().ToFloat2(), "terrain"); + tile.DrawAt(targetCell.ToPPos().ToFloat2(), pal); } } } diff --git a/OpenRA.Mods.RA/SupportPowers/IronCurtainPower.cs b/OpenRA.Mods.RA/SupportPowers/IronCurtainPower.cs index 62ea72c3ce..0890649e9b 100755 --- a/OpenRA.Mods.RA/SupportPowers/IronCurtainPower.cs +++ b/OpenRA.Mods.RA/SupportPowers/IronCurtainPower.cs @@ -98,8 +98,9 @@ namespace OpenRA.Mods.RA public void RenderBeforeWorld(WorldRenderer wr, World world) { var xy = Game.viewport.ViewToWorld(Viewport.LastMousePos); + var pal = wr.Palette("terrain"); foreach (var t in world.FindTilesInCircle(xy, range)) - tile.DrawAt( wr, t.ToPPos().ToFloat2(), "terrain" ); + tile.DrawAt(t.ToPPos().ToFloat2(), pal); } public string GetCursor(World world, CPos xy, MouseInput mi) diff --git a/OpenRA.Mods.RA/World/SmudgeLayer.cs b/OpenRA.Mods.RA/World/SmudgeLayer.cs index 98ac1bbb25..883a4c8fdb 100755 --- a/OpenRA.Mods.RA/World/SmudgeLayer.cs +++ b/OpenRA.Mods.RA/World/SmudgeLayer.cs @@ -78,6 +78,8 @@ namespace OpenRA.Mods.RA public void Render( WorldRenderer wr ) { var cliprect = Game.viewport.WorldBounds(world); + var pal = wr.Palette("terrain"); + foreach (var kv in tiles) { if (!cliprect.Contains(kv.Key.X,kv.Key.Y)) @@ -86,7 +88,7 @@ namespace OpenRA.Mods.RA if (world.ShroudObscures(kv.Key)) continue; - smudgeSprites[kv.Value.type- 1][kv.Value.index].DrawAt(wr, kv.Key.ToPPos().ToFloat2(), "terrain"); + smudgeSprites[kv.Value.type- 1][kv.Value.index].DrawAt(kv.Key.ToPPos().ToFloat2(), pal); } } }