Regenerate cached texture indices when the palette size changes.
This commit is contained in:
@@ -17,7 +17,6 @@ namespace OpenRA.Graphics
|
||||
{
|
||||
readonly IVertexBuffer<Vertex> 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<TerrainTile> 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);
|
||||
|
||||
@@ -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<string, PaletteReference> palettes = new Dictionary<string, PaletteReference>();
|
||||
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)
|
||||
|
||||
@@ -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<MPos, bool> isVisible)
|
||||
|
||||
Reference in New Issue
Block a user