From 889360d4c6e43ac2798cc8a6923df239690fbcb6 Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Sun, 10 May 2015 00:58:10 +0100 Subject: [PATCH] Regenerate cached texture indices when the palette size changes. --- OpenRA.Game/Graphics/TerrainRenderer.cs | 35 ++++++++++++------- OpenRA.Game/Graphics/WorldRenderer.cs | 8 +++++ .../Traits/World/ShroudRenderer.cs | 6 ++++ 3 files changed, 37 insertions(+), 12 deletions(-) diff --git a/OpenRA.Game/Graphics/TerrainRenderer.cs b/OpenRA.Game/Graphics/TerrainRenderer.cs index ee1fb69dda..4420087155 100644 --- a/OpenRA.Game/Graphics/TerrainRenderer.cs +++ b/OpenRA.Game/Graphics/TerrainRenderer.cs @@ -17,7 +17,6 @@ namespace OpenRA.Graphics { readonly IVertexBuffer vertexBuffer; readonly Vertex[] updateCellVertices = new Vertex[4]; - readonly float terrainPaletteIndex; readonly int rowStride; readonly WorldRenderer worldRenderer; @@ -25,6 +24,8 @@ namespace OpenRA.Graphics readonly CellLayer mapTiles; readonly Map map; + float terrainPaletteIndex; + public TerrainRenderer(World world, WorldRenderer wr) { worldRenderer = wr; @@ -34,21 +35,18 @@ namespace OpenRA.Graphics terrainPaletteIndex = wr.Palette("terrain").TextureIndex; rowStride = 4 * map.Bounds.Width; + vertexBuffer = Game.Renderer.Device.CreateVertexBuffer(rowStride * map.Bounds.Height); - var vertices = new Vertex[rowStride * map.Bounds.Height]; - vertexBuffer = Game.Renderer.Device.CreateVertexBuffer(vertices.Length); - - var nv = 0; - foreach (var cell in map.Cells) - { - GenerateTileVertices(vertices, nv, cell); - nv += 4; - } - - vertexBuffer.SetData(vertices, nv); + UpdateMap(); map.MapTiles.Value.CellEntryChanged += UpdateCell; map.MapHeight.Value.CellEntryChanged += UpdateCell; + + wr.PaletteInvalidated += () => + { + terrainPaletteIndex = wr.Palette("terrain").TextureIndex; + UpdateMap(); + }; } void GenerateTileVertices(Vertex[] vertices, int offset, CPos cell) @@ -58,6 +56,19 @@ namespace OpenRA.Graphics Util.FastCreateQuad(vertices, pos, tile, terrainPaletteIndex, offset, tile.Size); } + void UpdateMap() + { + var nv = 0; + var vertices = new Vertex[rowStride * map.Bounds.Height]; + foreach (var cell in map.Cells) + { + GenerateTileVertices(vertices, nv, cell); + nv += 4; + } + + vertexBuffer.SetData(vertices, nv); + } + public void UpdateCell(CPos cell) { var uv = cell.ToMPos(map.TileShape); diff --git a/OpenRA.Game/Graphics/WorldRenderer.cs b/OpenRA.Game/Graphics/WorldRenderer.cs index 5838615903..50de97c956 100644 --- a/OpenRA.Game/Graphics/WorldRenderer.cs +++ b/OpenRA.Game/Graphics/WorldRenderer.cs @@ -25,6 +25,8 @@ namespace OpenRA.Graphics public readonly Theater Theater; public Viewport Viewport { get; private set; } + public event Action PaletteInvalidated = null; + readonly HardwarePalette palette = new HardwarePalette(); readonly Dictionary palettes = new Dictionary(); readonly TerrainRenderer terrainRenderer; @@ -70,7 +72,13 @@ namespace OpenRA.Graphics if (allowOverwrite && palette.Contains(name)) ReplacePalette(name, pal); else + { + var oldHeight = palette.Height; palette.AddPalette(name, pal, allowModifiers); + + if (oldHeight != palette.Height && PaletteInvalidated != null) + PaletteInvalidated(); + } } public void ReplacePalette(string name, IPalette pal) diff --git a/OpenRA.Mods.Common/Traits/World/ShroudRenderer.cs b/OpenRA.Mods.Common/Traits/World/ShroudRenderer.cs index b4cd58db1c..6bc75c9e82 100644 --- a/OpenRA.Mods.Common/Traits/World/ShroudRenderer.cs +++ b/OpenRA.Mods.Common/Traits/World/ShroudRenderer.cs @@ -172,6 +172,12 @@ namespace OpenRA.Mods.Common.Traits fogPalette = wr.Palette(info.FogPalette); shroudPalette = wr.Palette(info.ShroudPalette); + + wr.PaletteInvalidated += () => + { + mapBorderShroudIsCached = false; + MarkCellsDirty(CellRegion.Expand(map.Cells, 1)); + }; } Edges GetEdges(MPos uv, Func isVisible)