Move editor template rendering to TerrainRenderer.
This commit is contained in:
@@ -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();
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user