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<bool> cellsDirty;
bool anyCellDirty;
readonly Sprite[] fogSprites, shroudSprites;
readonly (Sprite Sprite, float Scale, float Alpha)[] fogSprites, shroudSprites;
Shroud shroud;
Func<PPos, bool> 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]];
}