From 0c51d73be9da81eb11628a97a8a507645dc072f2 Mon Sep 17 00:00:00 2001 From: Pavel Penev Date: Sun, 20 Dec 2015 15:50:01 +0200 Subject: [PATCH] Enable use of "custom" palettes per tile Templates Keep the tileset's palette as default, defined on the tileset, but override it for any tile templates that may want to do so with a palette defined on the template. --- OpenRA.Game/Graphics/TerrainRenderer.cs | 29 ++++++++++++++++++++----- OpenRA.Game/Map/TileSet.cs | 1 + 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/OpenRA.Game/Graphics/TerrainRenderer.cs b/OpenRA.Game/Graphics/TerrainRenderer.cs index a6011527b0..7ef1e011ea 100644 --- a/OpenRA.Game/Graphics/TerrainRenderer.cs +++ b/OpenRA.Game/Graphics/TerrainRenderer.cs @@ -9,25 +9,34 @@ #endregion using System; +using System.Collections.Generic; using OpenRA.Traits; namespace OpenRA.Graphics { sealed class TerrainRenderer : IDisposable { - readonly TerrainSpriteLayer terrain; + const string TerrainPalette = "terrain"; + + readonly World world; + readonly Dictionary spriteLayers = new Dictionary(); readonly Theater theater; readonly CellLayer mapTiles; readonly CellLayer mapHeight; public TerrainRenderer(World world, WorldRenderer wr) { + this.world = world; theater = wr.Theater; mapTiles = world.Map.MapTiles.Value; mapHeight = world.Map.MapHeight.Value; - terrain = new TerrainSpriteLayer(world, wr, theater.Sheet, BlendMode.Alpha, - wr.Palette("terrain"), wr.World.Type != WorldType.Editor); + foreach (var template in world.TileSet.Templates) + { + var palette = template.Value.Palette ?? TerrainPalette; + spriteLayers.GetOrAdd(palette, pal => + new TerrainSpriteLayer(world, wr, theater.Sheet, BlendMode.Alpha, wr.Palette(palette), wr.World.Type != WorldType.Editor)); + } foreach (var cell in world.Map.AllCells) UpdateCell(cell); @@ -38,12 +47,18 @@ namespace OpenRA.Graphics public void UpdateCell(CPos cell) { - terrain.Update(cell, theater.TileSprite(mapTiles[cell])); + var tile = mapTiles[cell]; + var palette = world.TileSet.Templates[tile.Type].Palette ?? TerrainPalette; + var sprite = theater.TileSprite(tile); + foreach (var kv in spriteLayers) + kv.Value.Update(cell, palette == kv.Key ? sprite : null); } public void Draw(WorldRenderer wr, Viewport viewport) { - terrain.Draw(viewport); + foreach (var kv in spriteLayers.Values) + kv.Draw(wr.Viewport); + foreach (var r in wr.World.WorldActor.TraitsImplementing()) r.Render(wr); } @@ -52,7 +67,9 @@ namespace OpenRA.Graphics { mapTiles.CellEntryChanged -= UpdateCell; mapHeight.CellEntryChanged -= UpdateCell; - terrain.Dispose(); + + foreach (var kv in spriteLayers.Values) + kv.Dispose(); } } } diff --git a/OpenRA.Game/Map/TileSet.cs b/OpenRA.Game/Map/TileSet.cs index c886fd1ed4..1750484aba 100644 --- a/OpenRA.Game/Map/TileSet.cs +++ b/OpenRA.Game/Map/TileSet.cs @@ -73,6 +73,7 @@ namespace OpenRA public readonly int2 Size; public readonly bool PickAny; public readonly string Category; + public readonly string Palette; readonly TerrainTileInfo[] tileInfo;