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

@@ -114,6 +114,7 @@
<Compile Include="FileFormats\Blast.cs" /> <Compile Include="FileFormats\Blast.cs" />
<Compile Include="Filesystem\ZipFile.cs" /> <Compile Include="Filesystem\ZipFile.cs" />
<Compile Include="InstallUtils.cs" /> <Compile Include="InstallUtils.cs" />
<Compile Include="Primitives\Cached.cs" />
</ItemGroup> </ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it. <!-- To modify your build process, add your task inside one of the targets below and uncomment it.

View File

@@ -0,0 +1,60 @@
#region Copyright & License Information
/*
* Copyright 2007-2011 The OpenRA Developers (see AUTHORS)
* This file is part of OpenRA, which is free software. It is made
* available to you under the terms of the GNU General Public License
* as published by the Free Software Foundation. For more information,
* see COPYING.
*/
#endregion
using System;
namespace OpenRA.FileFormats
{
public class Cached<T>
{
Func<T> p;
T value;
bool hasValue;
public Cached(Func<T> p)
{
if (p == null)
throw new ArgumentNullException();
this.p = p;
}
public T Value
{
get
{
if (hasValue)
return value;
value = p();
hasValue = true;
return value;
}
}
public void Force()
{
#pragma warning disable 0168
var ignored = Value;
#pragma warning restore 0168
}
public void Invalidate()
{
hasValue = false;
}
}
public static class Cached
{
public static Cached<T> New<T>(Func<T> p) { return new Cached<T>(p); }
}
}

View File

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

View File

@@ -125,7 +125,7 @@ namespace OpenRA.Graphics
public void DrawSelectionBox(Actor selectedUnit, Color c) 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.Left, bounds.Top);
var Xy = new float2(bounds.Right, 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) public void RenderAfterWorld (WorldRenderer wr, Actor self)
{ {
var bounds = self.GetBounds(false); var bounds = self.Bounds.Value;
Color selectionColor = Color.White; Color selectionColor = Color.White;
var xy = new float2(bounds.Left, bounds.Top); var xy = new float2(bounds.Left, bounds.Top);
@@ -55,7 +55,7 @@ namespace OpenRA.Traits
public void DrawRollover(WorldRenderer wr, Actor self) 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.Left, bounds.Top);
var Xy = new float2(bounds.Right, bounds.Top); var Xy = new float2(bounds.Right, bounds.Top);
@@ -185,9 +185,11 @@ namespace OpenRA.Traits
if (thisRow == null) if (thisRow == null)
continue; continue;
var width = self.Bounds.Value.Width;
foreach (var pip in thisRow) foreach (var pip in thisRow)
{ {
if (pipxyOffset.X+5 > self.GetBounds(false).Width) if (pipxyOffset.X+5 > width)
{ {
pipxyOffset.X = 0; pipxyOffset.X = 0;
pipxyOffset.Y -= 4; pipxyOffset.Y -= 4;

View File

@@ -47,7 +47,7 @@ namespace OpenRA.Traits
foreach (var a in self.World.ActorsWithTrait<IHasLocation>()) 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.Right <= Game.CellSize * self.World.Map.Bounds.Left) continue;
if (bounds.Bottom <= Game.CellSize * self.World.Map.Bounds.Top) 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) return ActorsInBins(a.X / scale, b.X / scale, a.Y / scale, b.Y / scale)
.Distinct() .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 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); return inBox.Where(x => (x.CenterLocation - a).LengthSquared < r * r);
} }

View File

@@ -107,8 +107,7 @@ namespace OpenRA.Mods.RA
foreach (var r in rs) foreach (var r in rs)
yield return r; yield return r;
RankAnim.Tick(); // hack var bounds = self.Bounds.Value;
var bounds = self.GetBounds(false);
yield return new Renderable(RankAnim.Image, yield return new Renderable(RankAnim.Image,
new float2(bounds.Right - 6, bounds.Bottom - 8), "effect", self.CenterLocation.Y); new float2(bounds.Right - 6, bounds.Bottom - 8), "effect", self.CenterLocation.Y);
} }