Add ScreenBounds method to IRender interface.

This method is expected to return Rectangles that cover
the region where Renderables returned by Render may exist.
This commit is contained in:
Paul Chote
2017-12-05 17:40:45 +00:00
committed by reaperrr
parent 46f6263061
commit 86bfe28ade
15 changed files with 133 additions and 5 deletions

View File

@@ -11,6 +11,7 @@
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using OpenRA.Graphics;
using OpenRA.Mods.Common.Graphics;
@@ -154,7 +155,7 @@ namespace OpenRA.Mods.Common.Traits.Render
shadow.Tick();
}
public IEnumerable<IRenderable> Render(Actor self, WorldRenderer wr)
IEnumerable<IRenderable> IRender.Render(Actor self, WorldRenderer wr)
{
if (info.ShadowImage == null)
return Enumerable.Empty<IRenderable>();
@@ -170,5 +171,21 @@ namespace OpenRA.Mods.Common.Traits.Render
var palette = wr.Palette(info.ShadowPalette);
return new IRenderable[] { new SpriteRenderable(shadow.Image, pos, info.ShadowOffset, info.ShadowZOffset, palette, 1, true) };
}
IEnumerable<Rectangle> IRender.ScreenBounds(Actor self, WorldRenderer wr)
{
if (info.ShadowImage == null)
return Enumerable.Empty<Rectangle>();
if (IsTraitDisabled || self.IsDead || !self.IsInWorld)
return Enumerable.Empty<Rectangle>();
if (self.World.FogObscures(self))
return Enumerable.Empty<Rectangle>();
var dat = self.World.Map.DistanceAboveTerrain(self.CenterPosition);
var pos = self.CenterPosition - new WVec(0, 0, dat.Length);
return new Rectangle[] { shadow.ScreenBounds(wr, pos, info.ShadowOffset, 1) };
}
}
}