Merge pull request #10246 from penev92/terrainPalettes
Allow tile templates to define their own palette
This commit is contained in:
@@ -9,25 +9,32 @@
|
||||
#endregion
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using OpenRA.Traits;
|
||||
|
||||
namespace OpenRA.Graphics
|
||||
{
|
||||
sealed class TerrainRenderer : IDisposable
|
||||
{
|
||||
readonly TerrainSpriteLayer terrain;
|
||||
readonly World world;
|
||||
readonly Dictionary<string, TerrainSpriteLayer> spriteLayers = new Dictionary<string, TerrainSpriteLayer>();
|
||||
readonly Theater theater;
|
||||
readonly CellLayer<TerrainTile> mapTiles;
|
||||
readonly CellLayer<byte> 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 ?? TileSet.TerrainPaletteInternalName;
|
||||
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 +45,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 ?? TileSet.TerrainPaletteInternalName;
|
||||
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<IRenderOverlay>())
|
||||
r.Render(wr);
|
||||
}
|
||||
@@ -52,7 +65,9 @@ namespace OpenRA.Graphics
|
||||
{
|
||||
mapTiles.CellEntryChanged -= UpdateCell;
|
||||
mapHeight.CellEntryChanged -= UpdateCell;
|
||||
terrain.Dispose();
|
||||
|
||||
foreach (var kv in spriteLayers.Values)
|
||||
kv.Dispose();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user