Add Alpha support to sequences.

Alpha can specify a single value for the sequence
or values for each frame in the sequence.

AlphaFade: True can be specified to linearly fade
to transparent over the length of the animation.
This commit is contained in:
Paul Chote
2021-01-31 23:24:12 +00:00
committed by teinarss
parent 445d943549
commit 0975102e92
23 changed files with 189 additions and 78 deletions

View File

@@ -149,7 +149,7 @@ namespace OpenRA.Mods.Cnc.Graphics
var pos = wr.ProjectedPosition((z + new float2(step[2], step[3])).ToInt2());
var tintModifiers = s.IgnoreWorldTint ? TintModifiers.IgnoreWorldTint : TintModifiers.None;
rs.Add(new SpriteRenderable(s.GetSprite(step[4]), pos, WVec.Zero, 0, pal, 1f, true, tintModifiers).PrepareRender(wr));
rs.Add(new SpriteRenderable(s.GetSprite(step[4]), pos, WVec.Zero, 0, pal, 1f, s.GetAlpha(step[4]), float3.Ones, tintModifiers, true).PrepareRender(wr));
z += new float2(step[0], step[1]);
if (rs.Count >= 1000)

View File

@@ -200,9 +200,8 @@ namespace OpenRA.Mods.Cnc.Traits
{
readonly List<Actor> minelayers;
readonly Minelayer minelayer;
readonly Sprite tileOk;
readonly Sprite tileUnknown;
readonly Sprite tileBlocked;
readonly Sprite validTile, unknownTile, blockedTile;
readonly float validAlpha, unknownAlpha, blockedAlpha;
readonly CPos minefieldStart;
readonly bool queued;
@@ -215,19 +214,43 @@ namespace OpenRA.Mods.Cnc.Traits
minelayer = a.Trait<Minelayer>();
var tileset = a.World.Map.Tileset.ToLowerInvariant();
if (a.World.Map.Rules.Sequences.HasSequence("overlay", "{0}-{1}".F(minelayer.Info.TileValidName, tileset)))
tileOk = a.World.Map.Rules.Sequences.GetSequence("overlay", "{0}-{1}".F(minelayer.Info.TileValidName, tileset)).GetSprite(0);
{
var validSequence = a.World.Map.Rules.Sequences.GetSequence("overlay", "{0}-{1}".F(minelayer.Info.TileValidName, tileset));
validTile = validSequence.GetSprite(0);
validAlpha = validSequence.GetAlpha(0);
}
else
tileOk = a.World.Map.Rules.Sequences.GetSequence("overlay", minelayer.Info.TileValidName).GetSprite(0);
{
var validSequence = a.World.Map.Rules.Sequences.GetSequence("overlay", minelayer.Info.TileValidName);
validTile = validSequence.GetSprite(0);
validAlpha = validSequence.GetAlpha(0);
}
if (a.World.Map.Rules.Sequences.HasSequence("overlay", "{0}-{1}".F(minelayer.Info.TileUnknownName, tileset)))
tileUnknown = a.World.Map.Rules.Sequences.GetSequence("overlay", "{0}-{1}".F(minelayer.Info.TileUnknownName, tileset)).GetSprite(0);
{
var unknownSequence = a.World.Map.Rules.Sequences.GetSequence("overlay", "{0}-{1}".F(minelayer.Info.TileUnknownName, tileset));
unknownTile = unknownSequence.GetSprite(0);
unknownAlpha = unknownSequence.GetAlpha(0);
}
else
tileUnknown = a.World.Map.Rules.Sequences.GetSequence("overlay", minelayer.Info.TileUnknownName).GetSprite(0);
{
var unknownSequence = a.World.Map.Rules.Sequences.GetSequence("overlay", minelayer.Info.TileUnknownName);
unknownTile = unknownSequence.GetSprite(0);
unknownAlpha = unknownSequence.GetAlpha(0);
}
if (a.World.Map.Rules.Sequences.HasSequence("overlay", "{0}-{1}".F(minelayer.Info.TileInvalidName, tileset)))
tileBlocked = a.World.Map.Rules.Sequences.GetSequence("overlay", "{0}-{1}".F(minelayer.Info.TileInvalidName, tileset)).GetSprite(0);
{
var blockedSequence = a.World.Map.Rules.Sequences.GetSequence("overlay", "{0}-{1}".F(minelayer.Info.TileInvalidName, tileset));
blockedTile = blockedSequence.GetSprite(0);
blockedAlpha = blockedSequence.GetAlpha(0);
}
else
tileBlocked = a.World.Map.Rules.Sequences.GetSequence("overlay", minelayer.Info.TileInvalidName).GetSprite(0);
{
var blockedSequence = a.World.Map.Rules.Sequences.GetSequence("overlay", minelayer.Info.TileInvalidName);
blockedTile = blockedSequence.GetSprite(0);
blockedAlpha = blockedSequence.GetAlpha(0);
}
}
public void AddMinelayer(Actor a, CPos xy)
@@ -276,18 +299,31 @@ namespace OpenRA.Mods.Cnc.Traits
var pal = wr.Palette(TileSet.TerrainPaletteInternalName);
foreach (var c in minefield)
{
var tile = tileOk;
var tile = validTile;
var alpha = validAlpha;
if (!world.Map.Contains(c))
tile = tileBlocked;
{
tile = blockedTile;
alpha = blockedAlpha;
}
else if (world.ShroudObscures(c))
tile = tileBlocked;
{
tile = blockedTile;
alpha = blockedAlpha;
}
else if (world.FogObscures(c))
tile = tileUnknown;
{
tile = unknownTile;
alpha = unknownAlpha;
}
else if (!this.minelayer.IsCellAcceptable(minelayer, c)
|| !movement.CanEnterCell(c, null, BlockedByActor.Immovable) || (mobile != null && !mobile.CanStayInCell(c)))
tile = tileBlocked;
{
tile = blockedTile;
alpha = blockedAlpha;
}
yield return new SpriteRenderable(tile, world.Map.CenterOfCell(c), WVec.Zero, -511, pal, 1f, true, TintModifiers.IgnoreWorldTint);
yield return new SpriteRenderable(tile, world.Map.CenterOfCell(c), WVec.Zero, -511, pal, 1f, alpha, float3.Ones, TintModifiers.IgnoreWorldTint, true);
}
}

View File

@@ -143,6 +143,7 @@ namespace OpenRA.Mods.Cnc.Traits
readonly char[] footprint;
readonly CVec dimensions;
readonly Sprite tile;
readonly float alpha;
readonly SupportPowerManager manager;
readonly string order;
@@ -157,9 +158,11 @@ namespace OpenRA.Mods.Cnc.Traits
this.power = power;
var info = (ChronoshiftPowerInfo)power.Info;
var s = world.Map.Rules.Sequences.GetSequence(info.FootprintImage, info.SourceFootprintSequence);
footprint = info.Footprint.Where(c => !char.IsWhiteSpace(c)).ToArray();
dimensions = info.Dimensions;
tile = world.Map.Rules.Sequences.GetSequence(info.FootprintImage, info.SourceFootprintSequence).GetSprite(0);
tile = s.GetSprite(0);
alpha = s.GetAlpha(0);
}
protected override IEnumerable<Order> OrderInner(World world, CPos cell, int2 worldPixel, MouseInput mi)
@@ -203,7 +206,7 @@ namespace OpenRA.Mods.Cnc.Traits
var tiles = power.CellsMatching(xy, footprint, dimensions);
var palette = wr.Palette(((ChronoshiftPowerInfo)power.Info).TargetOverlayPalette);
foreach (var t in tiles)
yield return new SpriteRenderable(tile, wr.World.Map.CenterOfCell(t), WVec.Zero, -511, palette, 1f, true, TintModifiers.IgnoreWorldTint);
yield return new SpriteRenderable(tile, wr.World.Map.CenterOfCell(t), WVec.Zero, -511, palette, 1f, alpha, float3.Ones, TintModifiers.IgnoreWorldTint, true);
}
protected override string GetCursor(World world, CPos cell, int2 worldPixel, MouseInput mi)
@@ -219,6 +222,7 @@ namespace OpenRA.Mods.Cnc.Traits
readonly char[] footprint;
readonly CVec dimensions;
readonly Sprite validTile, invalidTile, sourceTile;
readonly float validAlpha, invalidAlpha, sourceAlpha;
readonly SupportPowerManager manager;
readonly string order;
@@ -236,12 +240,25 @@ namespace OpenRA.Mods.Cnc.Traits
var sequences = world.Map.Rules.Sequences;
var tilesetValid = info.ValidFootprintSequence + "-" + world.Map.Tileset.ToLowerInvariant();
if (sequences.HasSequence(info.FootprintImage, tilesetValid))
validTile = sequences.GetSequence(info.FootprintImage, tilesetValid).GetSprite(0);
{
var validSequence = sequences.GetSequence(info.FootprintImage, tilesetValid);
validTile = validSequence.GetSprite(0);
validAlpha = validSequence.GetAlpha(0);
}
else
validTile = sequences.GetSequence(info.FootprintImage, info.ValidFootprintSequence).GetSprite(0);
{
var validSequence = sequences.GetSequence(info.FootprintImage, info.ValidFootprintSequence);
validTile = validSequence.GetSprite(0);
validAlpha = validSequence.GetAlpha(0);
}
invalidTile = sequences.GetSequence(info.FootprintImage, info.InvalidFootprintSequence).GetSprite(0);
sourceTile = sequences.GetSequence(info.FootprintImage, info.SourceFootprintSequence).GetSprite(0);
var invalidSequence = sequences.GetSequence(info.FootprintImage, info.InvalidFootprintSequence);
invalidTile = invalidSequence.GetSprite(0);
invalidAlpha = invalidSequence.GetAlpha(0);
var sourceSequence = sequences.GetSequence(info.FootprintImage, info.SourceFootprintSequence);
sourceTile = sourceSequence.GetSprite(0);
sourceAlpha = sourceSequence.GetAlpha(0);
}
protected override IEnumerable<Order> OrderInner(World world, CPos cell, int2 worldPixel, MouseInput mi)
@@ -287,8 +304,10 @@ namespace OpenRA.Mods.Cnc.Traits
var delta = xy - sourceLocation;
foreach (var t in power.CellsMatching(sourceLocation, footprint, dimensions))
{
var tile = manager.Self.Owner.Shroud.IsExplored(t + delta) ? validTile : invalidTile;
yield return new SpriteRenderable(tile, wr.World.Map.CenterOfCell(t + delta), WVec.Zero, -511, palette, 1f, true, TintModifiers.IgnoreWorldTint);
var isValid = manager.Self.Owner.Shroud.IsExplored(t + delta);
var tile = isValid ? validTile : invalidTile;
var alpha = isValid ? validAlpha : invalidAlpha;
yield return new SpriteRenderable(tile, wr.World.Map.CenterOfCell(t + delta), WVec.Zero, -511, palette, 1f, alpha, float3.Ones, TintModifiers.IgnoreWorldTint, true);
}
// Unit previews
@@ -300,7 +319,8 @@ namespace OpenRA.Mods.Cnc.Traits
var canEnter = manager.Self.Owner.Shroud.IsExplored(targetCell) &&
unit.Trait<Chronoshiftable>().CanChronoshiftTo(unit, targetCell);
var tile = canEnter ? validTile : invalidTile;
yield return new SpriteRenderable(tile, wr.World.Map.CenterOfCell(targetCell), WVec.Zero, -511, palette, 1f, true, TintModifiers.IgnoreWorldTint);
var alpha = canEnter ? validAlpha : invalidAlpha;
yield return new SpriteRenderable(tile, wr.World.Map.CenterOfCell(targetCell), WVec.Zero, -511, palette, 1f, alpha, float3.Ones, TintModifiers.IgnoreWorldTint, true);
}
var offset = world.Map.CenterOfCell(xy) - world.Map.CenterOfCell(sourceLocation);
@@ -330,7 +350,7 @@ namespace OpenRA.Mods.Cnc.Traits
// Source tiles
foreach (var t in power.CellsMatching(sourceLocation, footprint, dimensions))
yield return new SpriteRenderable(sourceTile, wr.World.Map.CenterOfCell(t), WVec.Zero, -511, palette, 1f, true, TintModifiers.IgnoreWorldTint);
yield return new SpriteRenderable(sourceTile, wr.World.Map.CenterOfCell(t), WVec.Zero, -511, palette, 1f, sourceAlpha, float3.Ones, TintModifiers.IgnoreWorldTint, true);
}
bool IsValidTarget(CPos xy)