Use CellLayers for pathfinder debug.

This commit is contained in:
Paul Chote
2014-05-17 01:06:01 +12:00
parent 386b71de82
commit 5a00757eab

View File

@@ -11,6 +11,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Drawing; using System.Drawing;
using OpenRA;
using OpenRA.Graphics; using OpenRA.Graphics;
using OpenRA.Primitives; using OpenRA.Primitives;
using OpenRA.Traits; using OpenRA.Traits;
@@ -20,7 +21,7 @@ namespace OpenRA.Mods.RA
class PathfinderDebugOverlayInfo : TraitInfo<PathfinderDebugOverlay> { } class PathfinderDebugOverlayInfo : TraitInfo<PathfinderDebugOverlay> { }
class PathfinderDebugOverlay : IRenderOverlay, IWorldLoaded class PathfinderDebugOverlay : IRenderOverlay, IWorldLoaded
{ {
Dictionary<Player, int[,]> layers; Dictionary<Player, CellLayer<int>> layers;
int refreshTick; int refreshTick;
World world; World world;
public bool Visible; public bool Visible;
@@ -29,7 +30,7 @@ namespace OpenRA.Mods.RA
{ {
world = w; world = w;
refreshTick = 0; refreshTick = 0;
layers = new Dictionary<Player, int[,]>(8); layers = new Dictionary<Player, CellLayer<int>>(8);
// Enabled via Cheats menu // Enabled via Cheats menu
Visible = false; Visible = false;
@@ -39,15 +40,15 @@ namespace OpenRA.Mods.RA
{ {
if (maxWeight == 0) return; if (maxWeight == 0) return;
int[,] layer; CellLayer<int> layer;
if (!layers.TryGetValue(pl, out layer)) if (!layers.TryGetValue(pl, out layer))
{ {
layer = new int[world.Map.MapSize.X, world.Map.MapSize.Y]; layer = new CellLayer<int>(world.Map);
layers.Add(pl, layer); layers.Add(pl, layer);
} }
foreach (var p in cellWeights) foreach (var p in cellWeights)
layer[p.First.X, p.First.Y] = Math.Min(128, layer[p.First.X, p.First.Y] + (maxWeight - p.Second) * 64 / maxWeight); layer[p.First] = Math.Min(128, layer[p.First] + (maxWeight - p.Second) * 64 / maxWeight);
} }
public void Render(WorldRenderer wr) public void Render(WorldRenderer wr)
@@ -59,31 +60,27 @@ namespace OpenRA.Mods.RA
var doDim = refreshTick - world.WorldTick <= 0; var doDim = refreshTick - world.WorldTick <= 0;
if (doDim) refreshTick = world.WorldTick + 20; if (doDim) refreshTick = world.WorldTick + 20;
var viewBounds = wr.Viewport.CellBounds;
foreach (var pair in layers) foreach (var pair in layers)
{ {
var c = (pair.Key != null) ? pair.Key.Color.RGB : Color.PaleTurquoise; var c = (pair.Key != null) ? pair.Key.Color.RGB : Color.PaleTurquoise;
var layer = pair.Value; var layer = pair.Value;
// Only render quads in viewing range: // Only render quads in viewing range:
for (var j = viewBounds.Top; j <= viewBounds.Bottom; ++j) foreach (var cell in wr.Viewport.VisibleCells)
{ {
for (var i = viewBounds.Left; i <= viewBounds.Right; ++i) if (layer[cell] <= 0)
{
if (layer[i, j] <= 0)
continue; continue;
var w = Math.Max(0, Math.Min(layer[i, j], 128)); var w = Math.Max(0, Math.Min(layer[cell], 128));
if (doDim) if (doDim)
layer[i, j] = layer[i, j] * 5 / 6; layer[cell] = layer[cell] * 5 / 6;
// TODO: This doesn't make sense for isometric terrain // TODO: This doesn't make sense for isometric terrain
var tl = wr.ScreenPxPosition(new CPos(i, j).TopLeft); var tl = wr.ScreenPxPosition(cell.TopLeft);
var br = wr.ScreenPxPosition(new CPos(i, j).BottomRight); var br = wr.ScreenPxPosition(cell.BottomRight);
qr.FillRect(RectangleF.FromLTRB(tl.X, tl.Y, br.X, br.Y), Color.FromArgb(w, c)); qr.FillRect(RectangleF.FromLTRB(tl.X, tl.Y, br.X, br.Y), Color.FromArgb(w, c));
} }
} }
} }
} }
}
} }