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:
@@ -302,6 +302,12 @@ namespace OpenRA.Traits
|
|||||||
.SelectMany(ff => ff.Render(wr));
|
.SelectMany(ff => ff.Render(wr));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public IEnumerable<Rectangle> ScreenBounds(Actor self, WorldRenderer wr)
|
||||||
|
{
|
||||||
|
// Player-actor render traits don't require screen bounds
|
||||||
|
yield break;
|
||||||
|
}
|
||||||
|
|
||||||
public FrozenActor FromID(uint id)
|
public FrozenActor FromID(uint id)
|
||||||
{
|
{
|
||||||
FrozenActor fa;
|
FrozenActor fa;
|
||||||
|
|||||||
@@ -96,7 +96,11 @@ namespace OpenRA.Traits
|
|||||||
public interface ITick { void Tick(Actor self); }
|
public interface ITick { void Tick(Actor self); }
|
||||||
[RequireExplicitImplementation]
|
[RequireExplicitImplementation]
|
||||||
public interface ITickRender { void TickRender(WorldRenderer wr, Actor self); }
|
public interface ITickRender { void TickRender(WorldRenderer wr, Actor self); }
|
||||||
public interface IRender { IEnumerable<IRenderable> Render(Actor self, WorldRenderer wr); }
|
public interface IRender
|
||||||
|
{
|
||||||
|
IEnumerable<IRenderable> Render(Actor self, WorldRenderer wr);
|
||||||
|
IEnumerable<Rectangle> ScreenBounds(Actor self, WorldRenderer wr);
|
||||||
|
}
|
||||||
|
|
||||||
public interface IAutoSelectionSizeInfo : ITraitInfoInterface { }
|
public interface IAutoSelectionSizeInfo : ITraitInfoInterface { }
|
||||||
public interface IAutoSelectionSize { int2 SelectionSize(Actor self); }
|
public interface IAutoSelectionSize { int2 SelectionSize(Actor self); }
|
||||||
|
|||||||
@@ -10,6 +10,7 @@
|
|||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Drawing;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using OpenRA.Graphics;
|
using OpenRA.Graphics;
|
||||||
using OpenRA.Mods.Common;
|
using OpenRA.Mods.Common;
|
||||||
@@ -98,6 +99,14 @@ namespace OpenRA.Mods.Cnc.Traits.Render
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
IEnumerable<Rectangle> IRender.ScreenBounds(Actor self, WorldRenderer wr)
|
||||||
|
{
|
||||||
|
var pos = self.CenterPosition;
|
||||||
|
foreach (var p in previews.Values.SelectMany(p => p))
|
||||||
|
foreach (var b in p.ScreenBounds(wr, pos))
|
||||||
|
yield return b;
|
||||||
|
}
|
||||||
|
|
||||||
void INotifyPassengerEntered.OnPassengerEntered(Actor self, Actor passenger)
|
void INotifyPassengerEntered.OnPassengerEntered(Actor self, Actor passenger)
|
||||||
{
|
{
|
||||||
if (info.DisplayTypes.Contains(passenger.Trait<Passenger>().Info.CargoType))
|
if (info.DisplayTypes.Contains(passenger.Trait<Passenger>().Info.CargoType))
|
||||||
|
|||||||
@@ -11,6 +11,7 @@
|
|||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Drawing;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using OpenRA.Graphics;
|
using OpenRA.Graphics;
|
||||||
using OpenRA.Mods.Common.Traits.Render;
|
using OpenRA.Mods.Common.Traits.Render;
|
||||||
@@ -189,7 +190,7 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public IEnumerable<IRenderable> Render(Actor self, WorldRenderer wr)
|
IEnumerable<IRenderable> IRender.Render(Actor self, WorldRenderer wr)
|
||||||
{
|
{
|
||||||
var pal = wr.Palette(Info.MuzzlePalette);
|
var pal = wr.Palette(Info.MuzzlePalette);
|
||||||
|
|
||||||
@@ -199,6 +200,12 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
yield return r;
|
yield return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
IEnumerable<Rectangle> IRender.ScreenBounds(Actor self, WorldRenderer wr)
|
||||||
|
{
|
||||||
|
// Muzzle flashes don't contribute to actor bounds
|
||||||
|
yield break;
|
||||||
|
}
|
||||||
|
|
||||||
protected override void Tick(Actor self)
|
protected override void Tick(Actor self)
|
||||||
{
|
{
|
||||||
base.Tick(self);
|
base.Tick(self);
|
||||||
|
|||||||
@@ -11,6 +11,7 @@
|
|||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Drawing;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using OpenRA.Effects;
|
using OpenRA.Effects;
|
||||||
using OpenRA.GameRules;
|
using OpenRA.GameRules;
|
||||||
@@ -216,6 +217,25 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
return renderables[template];
|
return renderables[template];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public IEnumerable<Rectangle> ScreenBounds(Actor self, WorldRenderer wr)
|
||||||
|
{
|
||||||
|
foreach (var kv in footprint)
|
||||||
|
{
|
||||||
|
var xy = wr.ScreenPxPosition(wr.World.Map.CenterOfCell(kv.Key));
|
||||||
|
var size = wr.Theater.TileSprite(new TerrainTile(template, kv.Value)).Bounds.Size;
|
||||||
|
|
||||||
|
// Add an extra pixel padding to avoid issues with odd-sized sprites
|
||||||
|
var halfWidth = size.Width / 2 + 1;
|
||||||
|
var halfHeight = size.Height / 2 + 1;
|
||||||
|
|
||||||
|
yield return Rectangle.FromLTRB(
|
||||||
|
xy.X - halfWidth,
|
||||||
|
xy.Y - halfHeight,
|
||||||
|
xy.X + halfWidth,
|
||||||
|
xy.Y + halfHeight);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void KillUnitsOnBridge()
|
void KillUnitsOnBridge()
|
||||||
{
|
{
|
||||||
foreach (var c in footprint.Keys)
|
foreach (var c in footprint.Keys)
|
||||||
|
|||||||
@@ -192,6 +192,17 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
IEnumerable<Rectangle> IRender.ScreenBounds(Actor self, WorldRenderer wr)
|
||||||
|
{
|
||||||
|
if (carryablePreview == null)
|
||||||
|
yield break;
|
||||||
|
|
||||||
|
var pos = self.CenterPosition;
|
||||||
|
foreach (var p in carryablePreview)
|
||||||
|
foreach (var b in p.ScreenBounds(wr, pos))
|
||||||
|
yield return b;
|
||||||
|
}
|
||||||
|
|
||||||
IEnumerable<IOrderTargeter> IIssueOrder.Orders
|
IEnumerable<IOrderTargeter> IIssueOrder.Orders
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
|
|||||||
@@ -71,6 +71,12 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
return new IRenderable[] { trail };
|
return new IRenderable[] { trail };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
IEnumerable<Rectangle> IRender.ScreenBounds(Actor self, WorldRenderer wr)
|
||||||
|
{
|
||||||
|
// Contrails don't contribute to actor bounds
|
||||||
|
yield break;
|
||||||
|
}
|
||||||
|
|
||||||
void INotifyAddedToWorld.AddedToWorld(Actor self)
|
void INotifyAddedToWorld.AddedToWorld(Actor self)
|
||||||
{
|
{
|
||||||
trail = new ContrailRenderable(self.World, color, info.TrailWidth, info.TrailLength, 0, info.ZOffset);
|
trail = new ContrailRenderable(self.World, color, info.TrailWidth, info.TrailLength, 0, info.ZOffset);
|
||||||
|
|||||||
@@ -75,5 +75,11 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
yield return new TextRenderable(font, center, 0, info.Color, info.Type);
|
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) };
|
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;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Drawing;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using OpenRA.Graphics;
|
using OpenRA.Graphics;
|
||||||
using OpenRA.Mods.Common.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)
|
void ITick.Tick(Actor self)
|
||||||
{
|
{
|
||||||
Tick(self);
|
Tick(self);
|
||||||
|
|||||||
@@ -11,6 +11,7 @@
|
|||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Drawing;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using OpenRA.Graphics;
|
using OpenRA.Graphics;
|
||||||
using OpenRA.Mods.Common.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; }
|
public void OnOwnerChanged(Actor self, Player oldOwner, Player newOwner) { initializePalettes = true; }
|
||||||
|
|
||||||
protected PaletteReference colorPalette, normalsPalette, shadowPalette;
|
protected PaletteReference colorPalette, normalsPalette, shadowPalette;
|
||||||
public IEnumerable<IRenderable> Render(Actor self, WorldRenderer wr)
|
IEnumerable<IRenderable> IRender.Render(Actor self, WorldRenderer wr)
|
||||||
{
|
{
|
||||||
if (initializePalettes)
|
if (initializePalettes)
|
||||||
{
|
{
|
||||||
@@ -108,6 +109,14 @@ namespace OpenRA.Mods.Common.Traits.Render
|
|||||||
colorPalette, normalsPalette, shadowPalette) };
|
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 string Image { get { return info.Image ?? self.Info.Name; } }
|
||||||
public void Add(ModelAnimation v) { components.Add(v); }
|
public void Add(ModelAnimation v) { components.Add(v); }
|
||||||
public void Remove(ModelAnimation v) { components.Remove(v); }
|
public void Remove(ModelAnimation v) { components.Remove(v); }
|
||||||
|
|||||||
@@ -11,6 +11,7 @@
|
|||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Drawing;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using OpenRA.Graphics;
|
using OpenRA.Graphics;
|
||||||
using OpenRA.Traits;
|
using OpenRA.Traits;
|
||||||
@@ -86,7 +87,7 @@ namespace OpenRA.Mods.Common.Traits.Render
|
|||||||
|
|
||||||
void INotifyAttack.PreparingAttack(Actor self, Target target, Armament a, Barrel barrel) { }
|
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)
|
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)
|
void ITick.Tick(Actor self)
|
||||||
{
|
{
|
||||||
foreach (var a in anims.Values)
|
foreach (var a in anims.Values)
|
||||||
|
|||||||
@@ -11,6 +11,7 @@
|
|||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Drawing;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using OpenRA.Graphics;
|
using OpenRA.Graphics;
|
||||||
using OpenRA.Mods.Common.Graphics;
|
using OpenRA.Mods.Common.Graphics;
|
||||||
@@ -154,7 +155,7 @@ namespace OpenRA.Mods.Common.Traits.Render
|
|||||||
shadow.Tick();
|
shadow.Tick();
|
||||||
}
|
}
|
||||||
|
|
||||||
public IEnumerable<IRenderable> Render(Actor self, WorldRenderer wr)
|
IEnumerable<IRenderable> IRender.Render(Actor self, WorldRenderer wr)
|
||||||
{
|
{
|
||||||
if (info.ShadowImage == null)
|
if (info.ShadowImage == null)
|
||||||
return Enumerable.Empty<IRenderable>();
|
return Enumerable.Empty<IRenderable>();
|
||||||
@@ -170,5 +171,21 @@ namespace OpenRA.Mods.Common.Traits.Render
|
|||||||
var palette = wr.Palette(info.ShadowPalette);
|
var palette = wr.Palette(info.ShadowPalette);
|
||||||
return new IRenderable[] { new SpriteRenderable(shadow.Image, pos, info.ShadowOffset, info.ShadowZOffset, palette, 1, true) };
|
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;
|
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)
|
IEnumerable<IRenderable> IRenderAboveShroudWhenSelected.RenderAboveShroud(Actor self, WorldRenderer wr)
|
||||||
{
|
{
|
||||||
return Info.RequiresSelection ? RenderInner(self, wr) : SpriteRenderable.None;
|
return Info.RequiresSelection ? RenderInner(self, wr) : SpriteRenderable.None;
|
||||||
|
|||||||
@@ -98,6 +98,12 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
.SelectMany(p => p.Render());
|
.SelectMany(p => p.Render());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
IEnumerable<Rectangle> IRender.ScreenBounds(Actor self, WorldRenderer wr)
|
||||||
|
{
|
||||||
|
// World-actor render traits don't require screen bounds
|
||||||
|
yield break;
|
||||||
|
}
|
||||||
|
|
||||||
public EditorActorPreview Add(ActorReference reference) { return Add(NextActorName(), reference); }
|
public EditorActorPreview Add(ActorReference reference) { return Add(NextActorName(), reference); }
|
||||||
|
|
||||||
EditorActorPreview Add(string id, ActorReference reference, bool initialSetup = false)
|
EditorActorPreview Add(string id, ActorReference reference, bool initialSetup = false)
|
||||||
|
|||||||
Reference in New Issue
Block a user