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:
@@ -75,5 +75,11 @@ namespace OpenRA.Mods.Common.Traits
|
||||
yield return new TextRenderable(font, center, 0, info.Color, info.Type);
|
||||
}
|
||||
}
|
||||
|
||||
IEnumerable<Rectangle> IRender.ScreenBounds(Actor self, WorldRenderer wr)
|
||||
{
|
||||
// World-actor render traits don't require screen bounds
|
||||
yield break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -54,5 +54,11 @@ namespace OpenRA.Mods.Common.Traits.Render
|
||||
|
||||
return new IRenderable[] { new TextRenderable(font, effectPos, 0, color, name) };
|
||||
}
|
||||
|
||||
IEnumerable<Rectangle> IRender.ScreenBounds(Actor self, WorldRenderer wr)
|
||||
{
|
||||
// Name tags don't contribute to actor bounds
|
||||
yield break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using OpenRA.Graphics;
|
||||
using OpenRA.Mods.Common.Graphics;
|
||||
@@ -181,6 +182,13 @@ namespace OpenRA.Mods.Common.Traits.Render
|
||||
}
|
||||
}
|
||||
|
||||
public virtual IEnumerable<Rectangle> ScreenBounds(Actor self, WorldRenderer wr)
|
||||
{
|
||||
foreach (var a in anims)
|
||||
if (a.IsVisible)
|
||||
yield return a.Animation.ScreenBounds(self, wr, info.Scale);
|
||||
}
|
||||
|
||||
void ITick.Tick(Actor self)
|
||||
{
|
||||
Tick(self);
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using OpenRA.Graphics;
|
||||
using OpenRA.Mods.Common.Graphics;
|
||||
@@ -91,7 +92,7 @@ namespace OpenRA.Mods.Common.Traits.Render
|
||||
public void OnOwnerChanged(Actor self, Player oldOwner, Player newOwner) { initializePalettes = true; }
|
||||
|
||||
protected PaletteReference colorPalette, normalsPalette, shadowPalette;
|
||||
public IEnumerable<IRenderable> Render(Actor self, WorldRenderer wr)
|
||||
IEnumerable<IRenderable> IRender.Render(Actor self, WorldRenderer wr)
|
||||
{
|
||||
if (initializePalettes)
|
||||
{
|
||||
@@ -108,6 +109,14 @@ namespace OpenRA.Mods.Common.Traits.Render
|
||||
colorPalette, normalsPalette, shadowPalette) };
|
||||
}
|
||||
|
||||
IEnumerable<Rectangle> IRender.ScreenBounds(Actor self, WorldRenderer wr)
|
||||
{
|
||||
var pos = self.CenterPosition;
|
||||
foreach (var c in components)
|
||||
if (c.IsVisible)
|
||||
yield return c.ScreenBounds(pos, wr, info.Scale);
|
||||
}
|
||||
|
||||
public string Image { get { return info.Image ?? self.Info.Name; } }
|
||||
public void Add(ModelAnimation v) { components.Add(v); }
|
||||
public void Remove(ModelAnimation v) { components.Remove(v); }
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using OpenRA.Graphics;
|
||||
using OpenRA.Traits;
|
||||
@@ -86,7 +87,7 @@ namespace OpenRA.Mods.Common.Traits.Render
|
||||
|
||||
void INotifyAttack.PreparingAttack(Actor self, Target target, Armament a, Barrel barrel) { }
|
||||
|
||||
public IEnumerable<IRenderable> Render(Actor self, WorldRenderer wr)
|
||||
IEnumerable<IRenderable> IRender.Render(Actor self, WorldRenderer wr)
|
||||
{
|
||||
foreach (var arm in armaments)
|
||||
{
|
||||
@@ -103,6 +104,12 @@ namespace OpenRA.Mods.Common.Traits.Render
|
||||
}
|
||||
}
|
||||
|
||||
IEnumerable<Rectangle> IRender.ScreenBounds(Actor self, WorldRenderer wr)
|
||||
{
|
||||
// Muzzle flashes don't contribute to actor bounds
|
||||
yield break;
|
||||
}
|
||||
|
||||
void ITick.Tick(Actor self)
|
||||
{
|
||||
foreach (var a in anims.Values)
|
||||
|
||||
@@ -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) };
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -75,6 +75,12 @@ namespace OpenRA.Mods.Common.Traits.Render
|
||||
return !Info.RequiresSelection ? RenderInner(self, wr) : SpriteRenderable.None;
|
||||
}
|
||||
|
||||
IEnumerable<Rectangle> IRender.ScreenBounds(Actor self, WorldRenderer wr)
|
||||
{
|
||||
// Text decorations don't contribute to actor bounds
|
||||
yield break;
|
||||
}
|
||||
|
||||
IEnumerable<IRenderable> IRenderAboveShroudWhenSelected.RenderAboveShroud(Actor self, WorldRenderer wr)
|
||||
{
|
||||
return Info.RequiresSelection ? RenderInner(self, wr) : SpriteRenderable.None;
|
||||
|
||||
Reference in New Issue
Block a user