diff --git a/OpenRA.Mods.Common/Traits/World/EditorCursorLayer.cs b/OpenRA.Mods.Common/Traits/World/EditorCursorLayer.cs index f95e4c564f..a67e457462 100644 --- a/OpenRA.Mods.Common/Traits/World/EditorCursorLayer.cs +++ b/OpenRA.Mods.Common/Traits/World/EditorCursorLayer.cs @@ -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(); diff --git a/OpenRA.Mods.Common/Traits/World/TerrainRenderer.cs b/OpenRA.Mods.Common/Traits/World/TerrainRenderer.cs index 78ebe6adfb..6c3d5f6442 100644 --- a/OpenRA.Mods.Common/Traits/World/TerrainRenderer.cs +++ b/OpenRA.Mods.Common/Traits/World/TerrainRenderer.cs @@ -158,5 +158,53 @@ namespace OpenRA.Mods.Common.Traits return templateRect ?? Rectangle.Empty; } + + IEnumerable 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 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); + } + } + } } } diff --git a/OpenRA.Mods.Common/TraitsInterfaces.cs b/OpenRA.Mods.Common/TraitsInterfaces.cs index 7301a768ca..1c3ed3ca7a 100644 --- a/OpenRA.Mods.Common/TraitsInterfaces.cs +++ b/OpenRA.Mods.Common/TraitsInterfaces.cs @@ -656,5 +656,7 @@ namespace OpenRA.Mods.Common.Traits Sheet Sheet { get; } Sprite TileSprite(TerrainTile r, int? variant = null); Rectangle TemplateBounds(TerrainTemplateInfo template); + IEnumerable RenderUIPreview(WorldRenderer wr, TerrainTemplateInfo template, int2 origin, float scale); + IEnumerable RenderPreview(WorldRenderer wr, TerrainTemplateInfo template, WPos origin); } } diff --git a/OpenRA.Mods.Common/Widgets/TerrainTemplatePreviewWidget.cs b/OpenRA.Mods.Common/Widgets/TerrainTemplatePreviewWidget.cs index a471266855..0210e70026 100644 --- a/OpenRA.Mods.Common/Widgets/TerrainTemplatePreviewWidget.cs +++ b/OpenRA.Mods.Common/Widgets/TerrainTemplatePreviewWidget.cs @@ -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(); 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(); - 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); } } }