Reduce duplication between Map and PlayerRadarTerrain.

This commit is contained in:
Paul Chote
2020-07-03 17:41:28 +01:00
committed by Oliver Brakmann
parent 5f588561b6
commit b3ee8b447e
2 changed files with 54 additions and 64 deletions

View File

@@ -662,6 +662,34 @@ namespace OpenRA
return dataStream.ToArray(); return dataStream.ToArray();
} }
public Pair<Color, Color> GetTerrainColorPair(MPos uv)
{
Color left, right;
var tileset = Rules.TileSet;
var type = tileset.GetTileInfo(Tiles[uv]);
if (type != null)
{
if (type.MinColor != type.MaxColor)
{
left = Exts.ColorLerp(Game.CosmeticRandom.NextFloat(), type.MinColor, type.MaxColor);
right = Exts.ColorLerp(Game.CosmeticRandom.NextFloat(), type.MinColor, type.MaxColor);
}
else
left = right = type.MinColor;
if (tileset.MinHeightColorBrightness != 1.0f || tileset.MaxHeightColorBrightness != 1.0f)
{
var scale = float2.Lerp(tileset.MinHeightColorBrightness, tileset.MaxHeightColorBrightness, Height[uv] * 1f / Grid.MaximumTerrainHeight);
left = Color.FromArgb((int)(scale * left.R).Clamp(0, 255), (int)(scale * left.G).Clamp(0, 255), (int)(scale * left.B).Clamp(0, 255));
right = Color.FromArgb((int)(scale * right.R).Clamp(0, 255), (int)(scale * right.G).Clamp(0, 255), (int)(scale * right.B).Clamp(0, 255));
}
}
else
left = right = Color.Black;
return Pair.New(left, right);
}
public byte[] SavePreview() public byte[] SavePreview()
{ {
var tileset = Rules.TileSet; var tileset = Rules.TileSet;
@@ -701,42 +729,18 @@ namespace OpenRA
var stride = bitmapWidth * 4; var stride = bitmapWidth * 4;
var pxStride = 4; var pxStride = 4;
var minimapData = new byte[stride * height]; var minimapData = new byte[stride * height];
Color leftColor, rightColor; Pair<Color, Color> terrainColor = default(Pair<Color, Color>);
var useHeightModifiers = tileset.MinHeightColorBrightness != 1.0f || tileset.MaxHeightColorBrightness != 1.0f;
var minHeightBrightness = tileset.MinHeightColorBrightness;
var maxHeightBrightness = tileset.MaxHeightColorBrightness;
var heightModifier = 1f / Grid.MaximumTerrainHeight;
for (var y = 0; y < height; y++) for (var y = 0; y < height; y++)
{ {
for (var x = 0; x < width; x++) for (var x = 0; x < width; x++)
{ {
var uv = new MPos(x + Bounds.Left, y + Bounds.Top); var uv = new MPos(x + Bounds.Left, y + Bounds.Top);
var actorsThere = positions.Where(ap => ap.First == uv);
if (actorsThere.Any()) // FirstOrDefault will return a Pair(MPos.Zero, Color.Transparent) if positions is empty
{ var actorColor = positions.FirstOrDefault(ap => ap.First == uv).Second;
leftColor = rightColor = actorsThere.First().Second; if (actorColor.A == 0)
} terrainColor = GetTerrainColorPair(uv);
else
{
// Cell contains terrain
var type = tileset.GetTileInfo(Tiles[uv]);
if (type != null)
{
if (useHeightModifiers)
{
var left = Exts.ColorLerp(Game.CosmeticRandom.NextFloat(), type.MinColor, type.MaxColor);
var right = Exts.ColorLerp(Game.CosmeticRandom.NextFloat(), type.MinColor, type.MaxColor);
var scale = float2.Lerp(minHeightBrightness, maxHeightBrightness, heightModifier * Height[uv]);
leftColor = Color.FromArgb((int)(scale * left.R).Clamp(0, 255), (int)(scale * left.G).Clamp(0, 255), (int)(scale * left.B).Clamp(0, 255));
rightColor = Color.FromArgb((int)(scale * right.R).Clamp(0, 255), (int)(scale * right.G).Clamp(0, 255), (int)(scale * right.B).Clamp(0, 255));
}
else
leftColor = rightColor = type.MinColor;
}
else
leftColor = rightColor = Color.Black;
}
if (isRectangularIsometric) if (isRectangularIsometric)
{ {
@@ -746,28 +750,31 @@ namespace OpenRA
if (x + dx > 0) if (x + dx > 0)
{ {
var z = y * stride + xOffset - pxStride; var z = y * stride + xOffset - pxStride;
minimapData[z++] = leftColor.R; var c = actorColor.A == 0 ? terrainColor.First : actorColor;
minimapData[z++] = leftColor.G; minimapData[z++] = c.R;
minimapData[z++] = leftColor.B; minimapData[z++] = c.G;
minimapData[z++] = leftColor.A; minimapData[z++] = c.B;
minimapData[z] = c.A;
} }
if (xOffset < stride) if (xOffset < stride)
{ {
var z = y * stride + xOffset; var z = y * stride + xOffset;
minimapData[z++] = rightColor.R; var c = actorColor.A == 0 ? terrainColor.Second : actorColor;
minimapData[z++] = rightColor.G; minimapData[z++] = c.R;
minimapData[z++] = rightColor.B; minimapData[z++] = c.G;
minimapData[z++] = rightColor.A; minimapData[z++] = c.B;
minimapData[z] = c.A;
} }
} }
else else
{ {
var z = y * stride + pxStride * x; var z = y * stride + pxStride * x;
minimapData[z++] = leftColor.R; var c = actorColor.A == 0 ? terrainColor.First : actorColor;
minimapData[z++] = leftColor.G; minimapData[z++] = c.R;
minimapData[z++] = leftColor.B; minimapData[z++] = c.G;
minimapData[z++] = leftColor.A; minimapData[z++] = c.B;
minimapData[z] = c.A;
} }
} }
} }

View File

@@ -91,31 +91,14 @@ namespace OpenRA.Mods.Common.Traits
public static Pair<int, int> GetColor(Map map, MPos uv) public static Pair<int, int> GetColor(Map map, MPos uv)
{ {
var custom = map.CustomTerrain[uv]; var custom = map.CustomTerrain[uv];
Color leftColor, rightColor; if (custom != byte.MaxValue)
if (custom == byte.MaxValue)
{ {
var tileset = map.Rules.TileSet; var c = map.Rules.TileSet[custom].Color.ToArgb();
var type = tileset.GetTileInfo(map.Tiles[uv]); return Pair.New(c, c);
if (type != null)
{
if (tileset.MinHeightColorBrightness != 1.0f || tileset.MaxHeightColorBrightness != 1.0f)
{
var left = Exts.ColorLerp(Game.CosmeticRandom.NextFloat(), type.MinColor, type.MaxColor);
var right = Exts.ColorLerp(Game.CosmeticRandom.NextFloat(), type.MinColor, type.MaxColor);
var scale = float2.Lerp(tileset.MinHeightColorBrightness, tileset.MaxHeightColorBrightness, map.Height[uv] * 1f / map.Grid.MaximumTerrainHeight);
leftColor = Color.FromArgb((int)(scale * left.R).Clamp(0, 255), (int)(scale * left.G).Clamp(0, 255), (int)(scale * left.B).Clamp(0, 255));
rightColor = Color.FromArgb((int)(scale * right.R).Clamp(0, 255), (int)(scale * right.G).Clamp(0, 255), (int)(scale * right.B).Clamp(0, 255));
} }
else
leftColor = rightColor = type.MinColor;
}
else
leftColor = rightColor = Color.Black;
}
else
leftColor = rightColor = map.Rules.TileSet[custom].Color;
return Pair.New(leftColor.ToArgb(), rightColor.ToArgb()); var tc = map.GetTerrainColorPair(uv);
return Pair.New(tc.First.ToArgb(), tc.Second.ToArgb());
} }
} }
} }