Support multiple sheets in TerrainSpriteLayer.

This commit is contained in:
Paul Chote
2020-12-29 12:03:47 +00:00
committed by reaperrr
parent b0aa32cd1b
commit 142870d78a
7 changed files with 67 additions and 32 deletions

View File

@@ -13,6 +13,7 @@ using System.Collections.Generic;
using System.IO;
using System.Linq;
using OpenRA.Graphics;
using OpenRA.Primitives;
using OpenRA.Traits;
namespace OpenRA.Mods.Common.Traits
@@ -63,14 +64,12 @@ namespace OpenRA.Mods.Common.Traits
if (spriteLayer == null)
{
var first = r.Value.Variants.First().Value.GetSprite(0);
spriteLayer = new TerrainSpriteLayer(w, wr, first.Sheet, first.BlendMode, wr.World.Type != WorldType.Editor);
var emptySprite = new Sprite(first.Sheet, Rectangle.Empty, TextureChannel.Alpha);
spriteLayer = new TerrainSpriteLayer(w, wr, emptySprite, first.BlendMode, wr.World.Type != WorldType.Editor);
}
// All resources must share a sheet and blend mode
var sprites = r.Value.Variants.Values.SelectMany(v => Exts.MakeArray(v.Length, x => v.GetSprite(x)));
if (sprites.Any(s => s.Sheet != spriteLayer.Sheet))
throw new InvalidDataException("Resource sprites span multiple sheets. Try loading their sequences earlier.");
if (sprites.Any(s => s.BlendMode != spriteLayer.BlendMode))
throw new InvalidDataException("Resource sprites specify different blend modes. "
+ "Try using different ResourceRenderer traits for resource types that use different blend modes.");

View File

@@ -14,6 +14,7 @@ using System.Collections.Generic;
using System.IO;
using System.Linq;
using OpenRA.Graphics;
using OpenRA.Primitives;
using OpenRA.Traits;
namespace OpenRA.Mods.Common.Traits
@@ -190,26 +191,19 @@ namespace OpenRA.Mods.Common.Traits
visibleUnderFog = puv => map.Contains(puv);
var shroudSheet = shroudSprites[0].Sheet;
if (shroudSprites.Any(s => s.Sheet != shroudSheet))
throw new InvalidDataException("Shroud sprites span multiple sheets. Try loading their sequences earlier.");
var shroudBlend = shroudSprites[0].BlendMode;
if (shroudSprites.Any(s => s.BlendMode != shroudBlend))
throw new InvalidDataException("Shroud sprites must all use the same blend mode.");
var fogSheet = fogSprites[0].Sheet;
if (fogSprites.Any(s => s.Sheet != fogSheet))
throw new InvalidDataException("Fog sprites span multiple sheets. Try loading their sequences earlier.");
var fogBlend = fogSprites[0].BlendMode;
if (fogSprites.Any(s => s.BlendMode != fogBlend))
throw new InvalidDataException("Fog sprites must all use the same blend mode.");
var emptySprite = new Sprite(shroudSprites[0].Sheet, Rectangle.Empty, TextureChannel.Alpha);
shroudPaletteReference = wr.Palette(info.ShroudPalette);
fogPaletteReference = wr.Palette(info.FogPalette);
shroudLayer = new TerrainSpriteLayer(w, wr, shroudSheet, shroudBlend, false);
fogLayer = new TerrainSpriteLayer(w, wr, fogSheet, fogBlend, false);
shroudLayer = new TerrainSpriteLayer(w, wr, emptySprite, shroudBlend, false);
fogLayer = new TerrainSpriteLayer(w, wr, emptySprite, fogBlend, false);
WorldOnRenderPlayerChanged(world.RenderPlayer);
}

View File

@@ -14,6 +14,7 @@ using System.IO;
using System.Linq;
using OpenRA.Graphics;
using OpenRA.Mods.Common.Effects;
using OpenRA.Primitives;
using OpenRA.Traits;
namespace OpenRA.Mods.Common.Traits
@@ -114,16 +115,14 @@ namespace OpenRA.Mods.Common.Traits
var sprites = smudges.Values.SelectMany(v => Exts.MakeArray(v.Length, x => v.GetSprite(x))).ToList();
var sheet = sprites[0].Sheet;
var blendMode = sprites[0].BlendMode;
if (sprites.Any(s => s.Sheet != sheet))
throw new InvalidDataException("Resource sprites span multiple sheets. Try loading their sequences earlier.");
var emptySprite = new Sprite(sheet, Rectangle.Empty, TextureChannel.Alpha);
if (sprites.Any(s => s.BlendMode != blendMode))
throw new InvalidDataException("Smudges specify different blend modes. "
+ "Try using different smudge types for smudges that use different blend modes.");
paletteReference = wr.Palette(Info.Palette);
render = new TerrainSpriteLayer(w, wr, sheet, blendMode, w.Type != WorldType.Editor);
render = new TerrainSpriteLayer(w, wr, emptySprite, blendMode, w.Type != WorldType.Editor);
// Add map smudges
foreach (var kv in Info.InitialSmudges)

View File

@@ -80,7 +80,9 @@ namespace OpenRA.Mods.Common.Traits
void IWorldLoaded.WorldLoaded(World world, WorldRenderer wr)
{
worldRenderer = wr;
spriteLayer = new TerrainSpriteLayer(world, wr, tileCache.Sheet, BlendMode.Alpha, world.Type != WorldType.Editor);
var emptySprite = new Sprite(tileCache.Sheet, Rectangle.Empty, TextureChannel.Alpha);
spriteLayer = new TerrainSpriteLayer(world, wr, emptySprite, BlendMode.Alpha, world.Type != WorldType.Editor);
foreach (var cell in map.AllCells)
UpdateCell(cell);