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);
|
var pos = world.Map.CenterOfCell(cell);
|
||||||
|
|
||||||
if (Type == EditorCursorType.TerrainTemplate)
|
if (Type == EditorCursorType.TerrainTemplate)
|
||||||
{
|
terrainOrResourcePreview.AddRange(terrainRenderer.RenderPreview(wr, TerrainTemplate, pos));
|
||||||
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));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
var variant = Resource.Sequences.FirstOrDefault();
|
var variant = Resource.Sequences.FirstOrDefault();
|
||||||
|
|||||||
@@ -158,5 +158,53 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
|
|
||||||
return templateRect ?? Rectangle.Empty;
|
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; }
|
Sheet Sheet { get; }
|
||||||
Sprite TileSprite(TerrainTile r, int? variant = null);
|
Sprite TileSprite(TerrainTile r, int? variant = null);
|
||||||
Rectangle TemplateBounds(TerrainTemplateInfo template);
|
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 ITiledTerrainRenderer terrainRenderer;
|
||||||
readonly WorldRenderer worldRenderer;
|
readonly WorldRenderer worldRenderer;
|
||||||
readonly ITerrainInfo terrainInfo;
|
|
||||||
|
|
||||||
TerrainTemplateInfo template;
|
TerrainTemplateInfo template;
|
||||||
Rectangle bounds;
|
Rectangle bounds;
|
||||||
@@ -51,7 +50,6 @@ namespace OpenRA.Mods.Common.Widgets
|
|||||||
public TerrainTemplatePreviewWidget(WorldRenderer worldRenderer, World world)
|
public TerrainTemplatePreviewWidget(WorldRenderer worldRenderer, World world)
|
||||||
{
|
{
|
||||||
this.worldRenderer = worldRenderer;
|
this.worldRenderer = worldRenderer;
|
||||||
terrainInfo = world.Map.Rules.TerrainInfo;
|
|
||||||
terrainRenderer = world.WorldActor.TraitOrDefault<ITiledTerrainRenderer>();
|
terrainRenderer = world.WorldActor.TraitOrDefault<ITiledTerrainRenderer>();
|
||||||
if (terrainRenderer == null)
|
if (terrainRenderer == null)
|
||||||
throw new YamlException("TerrainTemplatePreviewWidget requires a tile-based terrain renderer.");
|
throw new YamlException("TerrainTemplatePreviewWidget requires a tile-based terrain renderer.");
|
||||||
@@ -61,7 +59,6 @@ namespace OpenRA.Mods.Common.Widgets
|
|||||||
: base(other)
|
: base(other)
|
||||||
{
|
{
|
||||||
worldRenderer = other.worldRenderer;
|
worldRenderer = other.worldRenderer;
|
||||||
terrainInfo = other.worldRenderer.World.Map.Rules.TerrainInfo;
|
|
||||||
terrainRenderer = other.terrainRenderer;
|
terrainRenderer = other.terrainRenderer;
|
||||||
Template = other.Template;
|
Template = other.Template;
|
||||||
GetScale = other.GetScale;
|
GetScale = other.GetScale;
|
||||||
@@ -74,33 +71,11 @@ namespace OpenRA.Mods.Common.Widgets
|
|||||||
if (template == null)
|
if (template == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
var grid = Game.ModData.Manifest.Get<MapGrid>();
|
|
||||||
var ts = grid.TileSize;
|
|
||||||
var gridType = grid.Type;
|
|
||||||
var scale = GetScale();
|
var scale = GetScale();
|
||||||
|
|
||||||
var sb = new Rectangle((int)(scale * bounds.X), (int)(scale * bounds.Y), (int)(scale * bounds.Width), (int)(scale * bounds.Height));
|
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 origin = RenderOrigin + new int2((RenderBounds.Size.Width - sb.Width) / 2 - sb.X, (RenderBounds.Size.Height - sb.Height) / 2 - sb.Y);
|
||||||
|
foreach (var r in terrainRenderer.RenderUIPreview(worldRenderer, template, origin, scale))
|
||||||
var i = 0;
|
r.PrepareRender(worldRenderer).Render(worldRenderer);
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user