Fix viewport-px / world-px confusion in ScreenMap. Fixes #3964.

This commit is contained in:
Paul Chote
2013-10-21 17:57:11 +13:00
parent bb8f4494f5
commit 33f514001e
3 changed files with 16 additions and 11 deletions

View File

@@ -29,7 +29,7 @@ namespace OpenRA.Orders
target = Target.FromActor(underCursor); target = Target.FromActor(underCursor);
else else
{ {
var frozen = world.ScreenMap.FrozenActorsAt(world.RenderPlayer, mi.Location) var frozen = world.ScreenMap.FrozenActorsAt(world.RenderPlayer, mi)
.Where(a => a.Info.Traits.Contains<ITargetableInfo>()) .Where(a => a.Info.Traits.Contains<ITargetableInfo>())
.OrderByDescending(a => a.Info.SelectionPriority()) .OrderByDescending(a => a.Info.SelectionPriority())
.FirstOrDefault(); .FirstOrDefault();
@@ -77,7 +77,7 @@ namespace OpenRA.Orders
target = Target.FromActor(underCursor); target = Target.FromActor(underCursor);
else else
{ {
var frozen = world.ScreenMap.FrozenActorsAt(world.RenderPlayer, mi.Location) var frozen = world.ScreenMap.FrozenActorsAt(world.RenderPlayer, mi)
.Where(a => a.Info.Traits.Contains<ITargetableInfo>()) .Where(a => a.Info.Traits.Contains<ITargetableInfo>())
.OrderByDescending(a => a.Info.SelectionPriority()) .OrderByDescending(a => a.Info.SelectionPriority())
.FirstOrDefault(); .FirstOrDefault();

View File

@@ -110,24 +110,29 @@ namespace OpenRA.Traits
} }
public static readonly IEnumerable<FrozenActor> NoFrozenActors = new FrozenActor[0].AsEnumerable(); public static readonly IEnumerable<FrozenActor> NoFrozenActors = new FrozenActor[0].AsEnumerable();
public IEnumerable<FrozenActor> FrozenActorsAt(Player viewer, int2 pxPos) public IEnumerable<FrozenActor> FrozenActorsAt(Player viewer, int2 worldPx)
{ {
if (viewer == null) if (viewer == null)
return NoFrozenActors; return NoFrozenActors;
var i = (pxPos.X / info.BinSize).Clamp(0, cols - 1); var i = (worldPx.X / info.BinSize).Clamp(0, cols - 1);
var j = (pxPos.Y / info.BinSize).Clamp(0, rows - 1); var j = (worldPx.Y / info.BinSize).Clamp(0, rows - 1);
return frozen[viewer][j*cols + i] return frozen[viewer][j*cols + i]
.Where(kv => kv.Key.IsValid && kv.Value.Contains(pxPos)) .Where(kv => kv.Key.IsValid && kv.Value.Contains(worldPx))
.Select(kv => kv.Key); .Select(kv => kv.Key);
} }
public IEnumerable<Actor> ActorsAt(int2 pxPos) public IEnumerable<FrozenActor> FrozenActorsAt(Player viewer, MouseInput mi)
{ {
var i = (pxPos.X / info.BinSize).Clamp(0, cols - 1); return FrozenActorsAt(viewer, worldRenderer.Viewport.ViewToWorldPx(mi.Location));
var j = (pxPos.Y / info.BinSize).Clamp(0, rows - 1); }
public IEnumerable<Actor> ActorsAt(int2 worldPx)
{
var i = (worldPx.X / info.BinSize).Clamp(0, cols - 1);
var j = (worldPx.Y / info.BinSize).Clamp(0, rows - 1);
return actors[j * cols + i] return actors[j * cols + i]
.Where(kv => kv.Key.IsInWorld && kv.Value.Contains(pxPos)) .Where(kv => kv.Key.IsInWorld && kv.Value.Contains(worldPx))
.Select(kv => kv.Key); .Select(kv => kv.Key);
} }

View File

@@ -117,7 +117,7 @@ namespace OpenRA.Widgets
return; return;
} }
var frozen = world.ScreenMap.FrozenActorsAt(world.RenderPlayer, Viewport.LastMousePos) var frozen = world.ScreenMap.FrozenActorsAt(world.RenderPlayer, worldRenderer.Viewport.ViewToWorldPx(Viewport.LastMousePos))
.Where(a => a.TooltipName != null) .Where(a => a.TooltipName != null)
.OrderByDescending(a => a.Info.SelectionPriority()) .OrderByDescending(a => a.Info.SelectionPriority())
.FirstOrDefault(); .FirstOrDefault();