Kill ITerrainTypeModifier for explicit updating of a custom layer in the map. Functionally equivalent, but MUCH faster.

This commit is contained in:
Paul Chote
2010-07-22 22:22:53 +12:00
parent 3e493cb93c
commit d21e9fe093
10 changed files with 27 additions and 49 deletions

View File

@@ -88,24 +88,19 @@ namespace OpenRA.Graphics
var bitmapData = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height),
ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
var customTerrain = world.WorldActor.traits.WithInterface<ITerrainTypeModifier>();
unsafe
{
int* c = (int*)bitmapData.Scan0;
for (var x = 0; x < map.Width; x++)
for (var y = 0; y < map.Height; y++)
{
var xy = new int2(x + map.TopLeft.X, y + map.TopLeft.Y);
foreach (var t in customTerrain)
{
var tt = t.GetTerrainType(xy);
if (tt != null)
{
*(c + (y * bitmapData.Stride >> 2) + x) = world.TileSet.Terrain[tt].Color.ToArgb();
break;
}
}
var mapX = x + map.TopLeft.X;
var mapY = y + map.TopLeft.Y;
var custom = map.CustomTerrain[mapX,mapY];
if (custom == null)
continue;
*(c + (y * bitmapData.Stride >> 2) + x) = world.TileSet.Terrain[custom].Color.ToArgb();
}
}
bitmap.UnlockBits(bitmapData);