Reduce duplication between Map and PlayerRadarTerrain.
This commit is contained in:
committed by
Oliver Brakmann
parent
5f588561b6
commit
b3ee8b447e
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user