Introduce IRenderable.IsDecoration and AsDecoration.

These are used to filter *Renderables that shouldn't
be copied for things like highlight or shadow.
This commit is contained in:
Paul Chote
2013-08-10 19:24:01 +12:00
parent 8fcbe7bb9e
commit be7fc57cdd
13 changed files with 43 additions and 24 deletions

View File

@@ -151,7 +151,7 @@ namespace OpenRA.Mods.RA
}
foreach (var t in TileSprites[currentTemplate])
yield return new SpriteRenderable(t.Value, t.Key.CenterPosition, 0, terrainPalette, 1f);
yield return new SpriteRenderable(t.Value, t.Key.CenterPosition, WVec.Zero, 0, terrainPalette, 1f, true);
}
void KillUnitsOnBridge()

View File

@@ -38,6 +38,7 @@ namespace OpenRA.Mods.RA.Effects
yield break;
foreach (var r in a.Render(wr))
if (!r.IsDecoration)
yield return r.WithPalette(wr.Palette("invuln"));
}
}

View File

@@ -72,7 +72,9 @@ namespace OpenRA.Mods.RA.Effects
var shadow = wr.Palette("shadow");
foreach (var c in rc)
{
yield return c.WithPalette(shadow).WithZOffset(-1);
if (!c.IsDecoration)
yield return c.WithPalette(shadow).WithZOffset(c.ZOffset - 1).AsDecoration();
yield return c.OffsetBy(pos - c.Pos);
}

View File

@@ -118,8 +118,8 @@ namespace OpenRA.Mods.RA
yield break;
var bounds = self.Bounds.Value;
var pos = new float2(bounds.Right, bounds.Bottom - 2);
yield return new SpriteRenderable(RankAnim.Image, pos, wr.Palette("effect"), self.CenterLocation.Y);
var pos = new PPos(bounds.Right, bounds.Bottom - 2).ToWPos(0);
yield return new SpriteRenderable(RankAnim.Image, pos, WVec.Zero, 0, wr.Palette("effect"), 1f, true);
}
}

View File

@@ -63,8 +63,10 @@ namespace OpenRA.Mods.RA.Render
foreach (var a in r)
{
yield return a;
if (disabled)
yield return a.WithPalette(wr.Palette("disabled")).WithZOffset(1);
if (disabled && !a.IsDecoration)
yield return a.WithPalette(wr.Palette("disabled"))
.WithZOffset(a.ZOffset + 1)
.AsDecoration();
}
}

View File

@@ -31,9 +31,11 @@ namespace OpenRA.Mods.RA.Render
? (int)Math.Abs((self.ActorID + Game.LocalTick) / 5 % 4 - 1) - 1 : 0;
// Contrails shouldn't cast shadows
var shadowSprites = r.Where(s => !(s is ContrailRenderable))
var shadowSprites = r.Where(s => !s.IsDecoration)
.Select(a => a.WithPalette(wr.Palette("shadow"))
.OffsetBy(new WVec(0, 0, -a.Pos.Z)).WithZOffset(a.ZOffset + a.Pos.Z));
.OffsetBy(new WVec(0, 0, -a.Pos.Z))
.WithZOffset(a.ZOffset + a.Pos.Z)
.AsDecoration());
var worldVisualOffset = new WVec(0,0,-43*visualOffset);
var flyingSprites = !flying ? r :

View File

@@ -60,11 +60,13 @@ namespace OpenRA.Mods.RA
public float Scale { get { return 1f; } }
public PaletteReference Palette { get { return null; } }
public int ZOffset { get { return zOffset; } }
public bool IsDecoration { get { return true; } }
public IRenderable WithScale(float newScale) { return new TeslaZapRenderable(pos, zOffset, length, image, brightZaps, dimZaps); }
public IRenderable WithPalette(PaletteReference newPalette) { return new TeslaZapRenderable(pos, zOffset, length, image, brightZaps, dimZaps); }
public IRenderable WithZOffset(int newOffset) { return new TeslaZapRenderable(pos, zOffset, length, image, brightZaps, dimZaps); }
public IRenderable OffsetBy(WVec vec) { return new TeslaZapRenderable(pos + vec, zOffset, length, image, brightZaps, dimZaps); }
public IRenderable AsDecoration() { return this; }
public void BeforeRender(WorldRenderer wr) { }
public void RenderDebugGeometry(WorldRenderer wr) { }
@@ -132,8 +134,8 @@ namespace OpenRA.Mods.RA
var step = steps.Where(t => (to - (z + new float2(t[0], t[1]))).LengthSquared < (to - z).LengthSquared)
.OrderBy(t => Math.Abs(float2.Dot(z + new float2(t[0], t[1]), q) + c)).First();
rs.Add(new SpriteRenderable(s.GetSprite(step[4]), z + new float2(step[2], step[3]),
wr.Palette("effect"), (int)from.Y));
var pos = new PPos((int)(z.X + step[2]), (int)(z.Y + step[3])).ToWPos(0);
rs.Add(new SpriteRenderable(s.GetSprite(step[4]), pos, WVec.Zero, 0, wr.Palette("effect"), 1f, true));
z += new float2(step[0], step[1]);
if (rs.Count >= 1000)