Store the radar layers in a single buffered sheet.

This commit is contained in:
Paul Chote
2014-12-02 18:30:25 +13:00
parent ae992d1403
commit ab4a8be66e

View File

@@ -37,6 +37,7 @@ namespace OpenRA.Mods.Common.Widgets
int2 previewOrigin = int2.Zero;
Rectangle mapRect = Rectangle.Empty;
Sheet radarSheet;
Sprite terrainSprite;
Sprite customTerrainSprite;
Sprite actorSprite;
@@ -47,6 +48,8 @@ namespace OpenRA.Mods.Common.Widgets
readonly RadarPings radarPings;
bool terrainDirty = true;
[ObjectCreator.UseCtor]
public RadarWidget(World world, WorldRenderer worldRenderer)
{
@@ -68,20 +71,14 @@ namespace OpenRA.Mods.Common.Widgets
previewOrigin = new int2((int)(previewScale * (size - width) / 2), (int)(previewScale * (size - height) / 2));
mapRect = new Rectangle(previewOrigin.X, previewOrigin.Y, (int)(previewScale * width), (int)(previewScale * height));
// Only needs to be done once
using (var terrainBitmap = Minimap.TerrainBitmap(world.Map.Rules.TileSets[world.Map.Tileset], world.Map))
{
var r = new Rectangle(0, 0, width, height);
var s = new Size(terrainBitmap.Width, terrainBitmap.Height);
var terrainSheet = new Sheet(s);
terrainSheet.GetTexture().SetData(terrainBitmap);
terrainSprite = new Sprite(terrainSheet, r, TextureChannel.Alpha);
// The four layers are stored in a 2x2 grid within a single texture
radarSheet = new Sheet(new Size(2 * width, 2 * height).NextPowerOf2());
radarSheet.CreateBuffer();
// Data is set in Tick()
customTerrainSprite = new Sprite(new Sheet(s), r, TextureChannel.Alpha);
actorSprite = new Sprite(new Sheet(s), r, TextureChannel.Alpha);
shroudSprite = new Sprite(new Sheet(s), r, TextureChannel.Alpha);
}
terrainSprite = new Sprite(radarSheet, new Rectangle(0, 0, width, height), TextureChannel.Alpha);
customTerrainSprite = new Sprite(radarSheet, new Rectangle(width, 0, width, height), TextureChannel.Alpha);
actorSprite = new Sprite(radarSheet, new Rectangle(0, height, width, height), TextureChannel.Alpha);
shroudSprite = new Sprite(radarSheet, new Rectangle(width, height, width, height), TextureChannel.Alpha);
}
public override string GetCursor(int2 pos)
@@ -199,20 +196,40 @@ namespace OpenRA.Mods.Common.Widgets
// This avoids obviously stale data from being shown when first opened.
// TODO: This delayed updating is a giant hack
--updateTicks;
if (terrainDirty)
{
using (var bitmap = Minimap.TerrainBitmap(world.TileSet, world.Map))
Util.FastCopyIntoSprite(terrainSprite, bitmap);
radarSheet.CommitData();
terrainDirty = false;
}
if (updateTicks <= 0)
{
updateTicks = 12;
using (var bitmap = Minimap.CustomTerrainBitmap(world))
customTerrainSprite.sheet.GetTexture().SetData(bitmap);
Util.FastCopyIntoSprite(customTerrainSprite, bitmap);
radarSheet.CommitData();
}
if (updateTicks == 8)
{
using (var bitmap = Minimap.ActorsBitmap(world))
actorSprite.sheet.GetTexture().SetData(bitmap);
Util.FastCopyIntoSprite(actorSprite, bitmap);
radarSheet.CommitData();
}
if (updateTicks == 4)
{
using (var bitmap = Minimap.ShroudBitmap(world))
shroudSprite.sheet.GetTexture().SetData(bitmap);
Util.FastCopyIntoSprite(shroudSprite, bitmap);
radarSheet.CommitData();
}
// Enable/Disable the radar
var enabled = IsEnabled();