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