Move editor template rendering to TerrainRenderer.

This commit is contained in:
Paul Chote
2020-10-15 22:00:33 +01:00
committed by reaperrr
parent 995c33a942
commit b86b638700
4 changed files with 53 additions and 45 deletions

View File

@@ -73,24 +73,7 @@ namespace OpenRA.Mods.Common.Traits
var pos = world.Map.CenterOfCell(cell);
if (Type == EditorCursorType.TerrainTemplate)
{
var i = 0;
for (var y = 0; y < TerrainTemplate.Size.Y; y++)
{
for (var x = 0; x < TerrainTemplate.Size.X; x++)
{
var tile = new TerrainTile(TerrainTemplate.Id, (byte)i++);
if (!world.Map.Rules.TerrainInfo.TryGetTerrainInfo(tile, out var tileInfo))
continue;
var sprite = terrainRenderer.TileSprite(tile, 0);
var offset = world.Map.Offset(new CVec(x, y), tileInfo.Height);
var palette = wr.Palette(TerrainTemplate.Palette ?? TileSet.TerrainPaletteInternalName);
terrainOrResourcePreview.Add(new SpriteRenderable(sprite, pos, offset, 0, palette, 1, false));
}
}
}
terrainOrResourcePreview.AddRange(terrainRenderer.RenderPreview(wr, TerrainTemplate, pos));
else
{
var variant = Resource.Sequences.FirstOrDefault();

View File

@@ -158,5 +158,53 @@ namespace OpenRA.Mods.Common.Traits
return templateRect ?? Rectangle.Empty;
}
IEnumerable<IRenderable> ITiledTerrainRenderer.RenderUIPreview(WorldRenderer wr, TerrainTemplateInfo template, int2 origin, float scale)
{
if (template == null)
yield break;
var ts = map.Grid.TileSize;
var gridType = map.Grid.Type;
var i = 0;
for (var y = 0; y < template.Size.Y; y++)
{
for (var x = 0; x < template.Size.X; x++)
{
var tile = new TerrainTile(template.Id, (byte)i++);
if (!terrainInfo.TryGetTileInfo(tile, out var tileInfo))
continue;
var sprite = tileCache.TileSprite(tile, 0);
var u = gridType == MapGridType.Rectangular ? x : (x - y) / 2f;
var v = gridType == MapGridType.Rectangular ? y : (x + y) / 2f;
var offset = (new float2(u * ts.Width, (v - 0.5f * tileInfo.Height) * ts.Height) - 0.5f * sprite.Size.XY).ToInt2();
var palette = template.Palette ?? TileSet.TerrainPaletteInternalName;
yield return new UISpriteRenderable(sprite, WPos.Zero, origin + offset, 0, wr.Palette(palette), scale);
}
}
}
IEnumerable<IRenderable> ITiledTerrainRenderer.RenderPreview(WorldRenderer wr, TerrainTemplateInfo template, WPos origin)
{
var i = 0;
for (var y = 0; y < template.Size.Y; y++)
{
for (var x = 0; x < template.Size.X; x++)
{
var tile = new TerrainTile(template.Id, (byte)i++);
if (!terrainInfo.TryGetTileInfo(tile, out var tileInfo))
continue;
var sprite = tileCache.TileSprite(tile, 0);
var offset = map.Offset(new CVec(x, y), tileInfo.Height);
var palette = wr.Palette(template.Palette ?? TileSet.TerrainPaletteInternalName);
yield return new SpriteRenderable(sprite, origin, offset, 0, palette, 1, false);
}
}
}
}
}

View File

@@ -656,5 +656,7 @@ namespace OpenRA.Mods.Common.Traits
Sheet Sheet { get; }
Sprite TileSprite(TerrainTile r, int? variant = null);
Rectangle TemplateBounds(TerrainTemplateInfo template);
IEnumerable<IRenderable> RenderUIPreview(WorldRenderer wr, TerrainTemplateInfo template, int2 origin, float scale);
IEnumerable<IRenderable> RenderPreview(WorldRenderer wr, TerrainTemplateInfo template, WPos origin);
}
}

View File

@@ -25,7 +25,6 @@ namespace OpenRA.Mods.Common.Widgets
readonly ITiledTerrainRenderer terrainRenderer;
readonly WorldRenderer worldRenderer;
readonly ITerrainInfo terrainInfo;
TerrainTemplateInfo template;
Rectangle bounds;
@@ -51,7 +50,6 @@ namespace OpenRA.Mods.Common.Widgets
public TerrainTemplatePreviewWidget(WorldRenderer worldRenderer, World world)
{
this.worldRenderer = worldRenderer;
terrainInfo = world.Map.Rules.TerrainInfo;
terrainRenderer = world.WorldActor.TraitOrDefault<ITiledTerrainRenderer>();
if (terrainRenderer == null)
throw new YamlException("TerrainTemplatePreviewWidget requires a tile-based terrain renderer.");
@@ -61,7 +59,6 @@ namespace OpenRA.Mods.Common.Widgets
: base(other)
{
worldRenderer = other.worldRenderer;
terrainInfo = other.worldRenderer.World.Map.Rules.TerrainInfo;
terrainRenderer = other.terrainRenderer;
Template = other.Template;
GetScale = other.GetScale;
@@ -74,33 +71,11 @@ namespace OpenRA.Mods.Common.Widgets
if (template == null)
return;
var grid = Game.ModData.Manifest.Get<MapGrid>();
var ts = grid.TileSize;
var gridType = grid.Type;
var scale = GetScale();
var sb = new Rectangle((int)(scale * bounds.X), (int)(scale * bounds.Y), (int)(scale * bounds.Width), (int)(scale * bounds.Height));
var origin = RenderOrigin + new int2((RenderBounds.Size.Width - sb.Width) / 2 - sb.X, (RenderBounds.Size.Height - sb.Height) / 2 - sb.Y);
var i = 0;
for (var y = 0; y < Template.Size.Y; y++)
{
for (var x = 0; x < Template.Size.X; x++)
{
var tile = new TerrainTile(Template.Id, (byte)(i++));
if (!terrainInfo.TryGetTerrainInfo(tile, out var tileInfo))
continue;
var sprite = terrainRenderer.TileSprite(tile, 0);
var size = new float2(sprite.Size.X * scale, sprite.Size.Y * scale);
var u = gridType == MapGridType.Rectangular ? x : (x - y) / 2f;
var v = gridType == MapGridType.Rectangular ? y : (x + y) / 2f;
var pos = origin + scale * (new float2(u * ts.Width, (v - 0.5f * tileInfo.Height) * ts.Height) - 0.5f * sprite.Size);
var palette = Template.Palette ?? TileSet.TerrainPaletteInternalName;
Game.Renderer.SpriteRenderer.DrawSprite(sprite, pos, worldRenderer.Palette(palette), size);
}
}
foreach (var r in terrainRenderer.RenderUIPreview(worldRenderer, template, origin, scale))
r.PrepareRender(worldRenderer).Render(worldRenderer);
}
}
}