Add sequence scale and alpha support to ShroudRenderer.
This commit is contained in:
@@ -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]];
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user