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<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]];
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user