reintroduce Cached<T>; use for Actor.Bounds, Actor.ExtendedBounds, which replace Actor.GetBounds(bool)

This commit is contained in:
Chris Forbes
2011-05-04 21:58:12 +12:00
parent b12a35af4c
commit ccc245ded4
8 changed files with 81 additions and 11 deletions

View File

@@ -28,6 +28,8 @@ namespace OpenRA
IOccupySpace OccupiesSpace;
IHasLocation HasLocation;
Lazy<IMove> Move;
public Cached<RectangleF> Bounds;
public Cached<RectangleF> ExtendedBounds;
public int2 Location
{ get {
@@ -84,10 +86,16 @@ namespace OpenRA
ApplyIRender = x => x.Render(this);
ApplyRenderModifier = (m, p) => p.ModifyRender(this, m);
Bounds = Cached.New( () => CalculateBounds(false) );
ExtendedBounds = Cached.New( () => CalculateBounds(true) );
}
public void Tick()
{
Bounds.Invalidate();
ExtendedBounds.Invalidate();
currentActivity = Util.RunActivity( this, currentActivity );
}
@@ -112,7 +120,7 @@ namespace OpenRA
// vertically to altitude = 0 to support FindUnitsInCircle queries
// When false, the bounding box is given for the actor
// at its current altitude
public RectangleF GetBounds(bool useAltitude)
RectangleF CalculateBounds(bool useAltitude)
{
var size = Size.Value;
var loc = CenterLocation - 0.5f * size;

View File

@@ -125,7 +125,7 @@ namespace OpenRA.Graphics
public void DrawSelectionBox(Actor selectedUnit, Color c)
{
var bounds = selectedUnit.GetBounds(false);
var bounds = selectedUnit.Bounds.Value;
var xy = new float2(bounds.Left, bounds.Top);
var Xy = new float2(bounds.Right, bounds.Top);

View File

@@ -30,7 +30,7 @@ namespace OpenRA.Traits
public void RenderAfterWorld (WorldRenderer wr, Actor self)
{
var bounds = self.GetBounds(false);
var bounds = self.Bounds.Value;
Color selectionColor = Color.White;
var xy = new float2(bounds.Left, bounds.Top);
@@ -55,7 +55,7 @@ namespace OpenRA.Traits
public void DrawRollover(WorldRenderer wr, Actor self)
{
var bounds = self.GetBounds(false);
var bounds = self.Bounds.Value;
var xy = new float2(bounds.Left, bounds.Top);
var Xy = new float2(bounds.Right, bounds.Top);
@@ -184,10 +184,12 @@ namespace OpenRA.Traits
var thisRow = pips.GetPips(self);
if (thisRow == null)
continue;
var width = self.Bounds.Value.Width;
foreach (var pip in thisRow)
{
if (pipxyOffset.X+5 > self.GetBounds(false).Width)
if (pipxyOffset.X+5 > width)
{
pipxyOffset.X = 0;
pipxyOffset.Y -= 4;

View File

@@ -47,7 +47,7 @@ namespace OpenRA.Traits
foreach (var a in self.World.ActorsWithTrait<IHasLocation>())
{
var bounds = a.Actor.GetBounds(true);
var bounds = a.Actor.ExtendedBounds.Value;
if (bounds.Right <= Game.CellSize * self.World.Map.Bounds.Left) continue;
if (bounds.Bottom <= Game.CellSize * self.World.Map.Bounds.Top) continue;
@@ -81,7 +81,7 @@ namespace OpenRA.Traits
return ActorsInBins(a.X / scale, b.X / scale, a.Y / scale, b.Y / scale)
.Distinct()
.Where(u => u.IsInWorld && u.GetBounds(true).IntersectsWith(r));
.Where(u => u.IsInWorld && u.ExtendedBounds.Value.IntersectsWith(r));
}
}
}

View File

@@ -45,7 +45,7 @@ namespace OpenRA
var rect = new RectangleF(min.X, min.Y, max.X - min.X, max.Y - min.Y);
var inBox = actors.Where(x => x.GetBounds(true).IntersectsWith(rect));
var inBox = actors.Where(x => x.ExtendedBounds.Value.IntersectsWith(rect));
return inBox.Where(x => (x.CenterLocation - a).LengthSquared < r * r);
}