diff --git a/OpenRA.Mods.Common/Traits/World/ShroudRenderer.cs b/OpenRA.Mods.Common/Traits/World/ShroudRenderer.cs index 0b22ff6689..92188bac97 100644 --- a/OpenRA.Mods.Common/Traits/World/ShroudRenderer.cs +++ b/OpenRA.Mods.Common/Traits/World/ShroudRenderer.cs @@ -102,7 +102,7 @@ namespace OpenRA.Mods.Common.Traits readonly CellLayer tileInfos; readonly CellLayer cellsDirty; bool anyCellDirty; - readonly Sprite[] fogSprites, shroudSprites; + readonly (Sprite Sprite, float Scale, float Alpha)[] fogSprites, shroudSprites; Shroud shroud; Func visibleUnderShroud, visibleUnderFog; @@ -136,8 +136,8 @@ namespace OpenRA.Mods.Common.Traits // Load sprite variants var variantCount = info.ShroudVariants.Length; variantStride = (byte)(info.Index.Length + (info.OverrideFullShroud != null ? 1 : 0)); - shroudSprites = new Sprite[variantCount * variantStride]; - fogSprites = new Sprite[variantCount * variantStride]; + shroudSprites = new (Sprite, float, float)[variantCount * variantStride]; + fogSprites = new (Sprite, float, float)[variantCount * variantStride]; var sequenceProvider = map.Rules.Sequences; for (var j = 0; j < variantCount; j++) @@ -146,15 +146,17 @@ namespace OpenRA.Mods.Common.Traits var fogSequence = sequenceProvider.GetSequence(info.Sequence, info.FogVariants[j]); for (var i = 0; i < info.Index.Length; i++) { - shroudSprites[j * variantStride + i] = shroudSequence.GetSprite(i); - fogSprites[j * variantStride + i] = fogSequence.GetSprite(i); + shroudSprites[j * variantStride + i] = (shroudSequence.GetSprite(i), shroudSequence.Scale, shroudSequence.GetAlpha(i)); + fogSprites[j * variantStride + i] = (fogSequence.GetSprite(i), fogSequence.Scale, fogSequence.GetAlpha(i)); } if (info.OverrideFullShroud != null) { var i = (j + 1) * variantStride - 1; - shroudSprites[i] = sequenceProvider.GetSequence(info.Sequence, info.OverrideFullShroud).GetSprite(0); - fogSprites[i] = sequenceProvider.GetSequence(info.Sequence, info.OverrideFullFog).GetSprite(0); + shroudSequence = sequenceProvider.GetSequence(info.Sequence, info.OverrideFullShroud); + fogSequence = sequenceProvider.GetSequence(info.Sequence, info.OverrideFullFog); + shroudSprites[i] = (shroudSequence.GetSprite(0), shroudSequence.Scale, shroudSequence.GetAlpha(0)); + fogSprites[i] = (fogSequence.GetSprite(0), fogSequence.Scale, fogSequence.GetAlpha(0)); } } @@ -191,15 +193,15 @@ namespace OpenRA.Mods.Common.Traits visibleUnderFog = puv => map.Contains(puv); - var shroudBlend = shroudSprites[0].BlendMode; - if (shroudSprites.Any(s => s.BlendMode != shroudBlend)) + var shroudBlend = shroudSprites[0].Sprite.BlendMode; + if (shroudSprites.Any(s => s.Sprite.BlendMode != shroudBlend)) throw new InvalidDataException("Shroud sprites must all use the same blend mode."); - var fogBlend = fogSprites[0].BlendMode; - if (fogSprites.Any(s => s.BlendMode != fogBlend)) + var fogBlend = fogSprites[0].Sprite.BlendMode; + if (fogSprites.Any(s => s.Sprite.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); + var emptySprite = new Sprite(shroudSprites[0].Sprite.Sheet, Rectangle.Empty, TextureChannel.Alpha); shroudPaletteReference = wr.Palette(info.ShroudPalette); fogPaletteReference = wr.Palette(info.FogPalette); shroudLayer = new TerrainSpriteLayer(w, wr, emptySprite, shroudBlend, false); @@ -286,16 +288,16 @@ namespace OpenRA.Mods.Common.Traits var tileInfo = tileInfos[uv]; var shroudSprite = GetSprite(shroudSprites, GetEdges(puv, visibleUnderShroud), tileInfo.Variant); var shroudPos = tileInfo.ScreenPosition; - if (shroudSprite != null) - shroudPos += shroudSprite.Offset - 0.5f * shroudSprite.Size; + if (shroudSprite.Sprite != null) + shroudPos += shroudSprite.Sprite.Offset - 0.5f * shroudSprite.Sprite.Size; var fogSprite = GetSprite(fogSprites, GetEdges(puv, visibleUnderFog), tileInfo.Variant); var fogPos = tileInfo.ScreenPosition; - if (fogSprite != null) - fogPos += fogSprite.Offset - 0.5f * fogSprite.Size; + if (fogSprite.Sprite != null) + fogPos += fogSprite.Sprite.Offset - 0.5f * fogSprite.Sprite.Size; - shroudLayer.Update(uv, shroudSprite, shroudPaletteReference, shroudPos, 1f, 1f, true); - fogLayer.Update(uv, fogSprite, fogPaletteReference, fogPos, 1f, 1f, true); + shroudLayer.Update(uv, shroudSprite.Sprite, shroudPaletteReference, shroudPos, shroudSprite.Scale, shroudSprite.Alpha, true); + fogLayer.Update(uv, fogSprite.Sprite, fogPaletteReference, fogPos, fogSprite.Scale, fogSprite.Alpha, true); } anyCellDirty = false; @@ -319,10 +321,10 @@ namespace OpenRA.Mods.Common.Traits cellsDirty[cell + direction] = true; } - Sprite GetSprite(Sprite[] sprites, Edges edges, int variant) + (Sprite Sprite, float Scale, float Alpha) GetSprite((Sprite, float, float)[] sprites, Edges edges, int variant) { if (edges == Edges.None) - return null; + return (null, 1f, 1f); return sprites[variant * variantStride + edgesToSpriteIndexOffset[(byte)edges]]; }