Add sequence scale and alpha support to ShroudRenderer.

This commit is contained in:
Paul Chote
2021-02-20 11:14:18 +00:00
committed by reaperrr
parent 96c3825b6a
commit a90e6940ab

View File

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