Optimizations & minor visual changes to sonar UI

This commit is contained in:
Joonas Rikkonen
2017-11-01 20:59:30 +02:00
parent ec020f43d3
commit 25664ea611
@@ -14,6 +14,15 @@ namespace Barotrauma.Items.Components
private List<RadarBlip> radarBlips; private List<RadarBlip> radarBlips;
private static Color[] blipColorGradient =
{
Color.TransparentBlack,
new Color(0, 50, 160),
new Color(0, 133, 166),
new Color(2, 159, 30),
new Color(255, 255, 255)
};
public override void AddToGUIUpdateList() public override void AddToGUIUpdateList()
{ {
GuiFrame.AddToGUIUpdateList(); GuiFrame.AddToGUIUpdateList();
@@ -34,6 +43,7 @@ namespace Barotrauma.Items.Components
float pingRadius = displayRadius * pingState; float pingRadius = displayRadius * pingState;
Ping(item.WorldPosition, pingRadius, prevPingRadius, displayScale, range, 2.0f); Ping(item.WorldPosition, pingRadius, prevPingRadius, displayScale, range, 2.0f);
prevPingRadius = pingRadius; prevPingRadius = pingRadius;
return;
} }
float passivePingRadius = (float)Math.Sin(Timing.TotalTime * 10); float passivePingRadius = (float)Math.Sin(Timing.TotalTime * 10);
@@ -47,7 +57,7 @@ namespace Barotrauma.Items.Components
{ {
Ping(t.WorldPosition, t.SoundRange * passivePingRadius * 0.2f, t.SoundRange * prevPassivePingRadius * 0.2f, displayScale, t.SoundRange, 0.5f); Ping(t.WorldPosition, t.SoundRange * passivePingRadius * 0.2f, t.SoundRange * prevPassivePingRadius * 0.2f, displayScale, t.SoundRange, 0.5f);
radarBlips.Add(new RadarBlip(t.WorldPosition, 1.0f)); radarBlips.Add(new RadarBlip(t.WorldPosition, 1.0f, 1.0f));
} }
} }
} }
@@ -181,6 +191,32 @@ namespace Barotrauma.Items.Components
private void Ping(Vector2 pingSource, float pingRadius, float prevPingRadius, float displayScale, float range, float pingStrength = 1.0f) private void Ping(Vector2 pingSource, float pingRadius, float prevPingRadius, float displayScale, float range, float pingStrength = 1.0f)
{ {
//inside a hull -> only show the edges of the hull
if (item.CurrentHull != null && DetectSubmarineWalls)
{
CreateBlipsForLine(
new Vector2(item.CurrentHull.WorldRect.X, item.CurrentHull.WorldRect.Y),
new Vector2(item.CurrentHull.WorldRect.Right, item.CurrentHull.WorldRect.Y),
pingRadius, prevPingRadius, 50.0f, 5.0f, range, 2.0f);
CreateBlipsForLine(
new Vector2(item.CurrentHull.WorldRect.X, item.CurrentHull.WorldRect.Y - item.CurrentHull.Rect.Height),
new Vector2(item.CurrentHull.WorldRect.Right, item.CurrentHull.WorldRect.Y - item.CurrentHull.Rect.Height),
pingRadius, prevPingRadius, 50.0f, 5.0f, range, 2.0f);
CreateBlipsForLine(
new Vector2(item.CurrentHull.WorldRect.X, item.CurrentHull.WorldRect.Y),
new Vector2(item.CurrentHull.WorldRect.X, item.CurrentHull.WorldRect.Y - item.CurrentHull.Rect.Height),
pingRadius, prevPingRadius, 50.0f, 5.0f, range, 2.0f);
CreateBlipsForLine(
new Vector2(item.CurrentHull.WorldRect.Right, item.CurrentHull.WorldRect.Y),
new Vector2(item.CurrentHull.WorldRect.Right, item.CurrentHull.WorldRect.Y - item.CurrentHull.Rect.Height),
pingRadius, prevPingRadius, 50.0f, 5.0f, range, 2.0f);
return;
}
foreach (Submarine submarine in Submarine.Loaded) foreach (Submarine submarine in Submarine.Loaded)
{ {
if (item.Submarine == submarine && !DetectSubmarineWalls) continue; if (item.Submarine == submarine && !DetectSubmarineWalls) continue;
@@ -273,15 +309,15 @@ namespace Barotrauma.Items.Components
if (pointDist > prevPingRadius && pointDist < pingRadius) if (pointDist > prevPingRadius && pointDist < pingRadius)
{ {
for (int i = 0; i <= limb.Mass / 100.0f; i++) var blip = new RadarBlip(
{ limb.WorldPosition + Rand.Vector(limb.Mass / 10.0f),
var blip = new RadarBlip(limb.WorldPosition + Rand.Vector(limb.Mass / 10.0f), MathHelper.Clamp(limb.Mass, 0.1f, pingStrength)); MathHelper.Clamp(limb.Mass, 0.1f, pingStrength),
MathHelper.Clamp(limb.Mass * 0.1f, 0.1f, 2.0f));
radarBlips.Add(blip); radarBlips.Add(blip);
} }
} }
} }
} }
}
private void CreateBlipsForLine(Vector2 point1, Vector2 point2, float pingRadius, float prevPingRadius, private void CreateBlipsForLine(Vector2 point1, Vector2 point2, float pingRadius, float prevPingRadius,
float lineStep, float zStep, float range, float pingStrength) float lineStep, float zStep, float range, float pingStrength)
@@ -311,7 +347,7 @@ namespace Barotrauma.Items.Components
int minDist = 200; int minDist = 200;
radarBlips.RemoveAll(b => b.FadeTimer < fadeTimer && Math.Abs(pos.X - b.Position.X) < minDist && Math.Abs(pos.Y - b.Position.Y) < minDist); radarBlips.RemoveAll(b => b.FadeTimer < fadeTimer && Math.Abs(pos.X - b.Position.X) < minDist && Math.Abs(pos.Y - b.Position.Y) < minDist);
var blip = new RadarBlip(pos, fadeTimer); var blip = new RadarBlip(pos, fadeTimer, 1.0f + ((pointDist+z) / displayRadius));
radarBlips.Add(blip); radarBlips.Add(blip);
zStep += 0.5f; zStep += 0.5f;
@@ -335,52 +371,40 @@ namespace Barotrauma.Items.Components
{ {
strength = MathHelper.Clamp(strength, 0.0f, 1.0f); strength = MathHelper.Clamp(strength, 0.0f, 1.0f);
Color[] colors = new Color[] { float scaledT = strength * (blipColorGradient.Length - 1);
Color.TransparentBlack, Color color = Color.Lerp(blipColorGradient[(int)scaledT], blipColorGradient[(int)Math.Min(scaledT + 1, blipColorGradient.Length - 1)], (scaledT - (int)scaledT));
new Color(0, 50, 160),
new Color(0, 133, 166),
new Color(2, 159, 30),
new Color(255, 255, 255) };
float scaledT = strength * (colors.Length - 1);
Color color = Color.Lerp(colors[(int)scaledT], colors[(int)Math.Min(scaledT + 1, colors.Length - 1)], (scaledT - (int)scaledT));
Vector2 pos = (blip.Position - item.WorldPosition) * displayScale; Vector2 pos = (blip.Position - item.WorldPosition) * displayScale;
pos.Y = -pos.Y; pos.Y = -pos.Y;
if (pos.Length() > displayRadius) float posDist = pos.Length();
if (posDist > displayRadius)
{ {
blip.FadeTimer = 0.0f; blip.FadeTimer = 0.0f;
return; return;
} }
float posDist = pos.Length();
Vector2 dir = pos / posDist;
float distFactor = (posDist / displayRadius);
Vector2 normal = new Vector2(dir.Y, -dir.X);
float scale = (strength + 3.0f) * Math.Max(distFactor * 3.0f, 1.0f);
if (radarBlip == null) if (radarBlip == null)
{ {
GUI.DrawRectangle(spriteBatch, center + pos, Vector2.One * 4, Color.Magenta, true); GUI.DrawRectangle(spriteBatch, center + pos, Vector2.One * 4, Color.Magenta, true);
return; return;
} }
Vector2 dir = pos / posDist;
Vector2 normal = new Vector2(dir.Y, -dir.X);
float scale = (strength + 3.0f) * blip.Scale;
radarBlip.Draw(spriteBatch, center + pos, color, radarBlip.Origin, MathUtils.VectorToAngle(pos), radarBlip.Draw(spriteBatch, center + pos, color, radarBlip.Origin, MathUtils.VectorToAngle(pos),
new Vector2(scale * 0.3f, scale) * 0.04f, SpriteEffects.None, 0); new Vector2(scale * 0.5f, scale) * 0.04f, SpriteEffects.None, 0);
pos += Rand.Range(0.0f, 1.0f) * dir + Rand.Range(-scale, scale) * normal; pos += Rand.Range(0.0f, 1.0f) * dir + Rand.Range(-scale, scale) * normal;
radarBlip.Draw(spriteBatch, center + pos, color * 0.5f, radarBlip.Origin, MathUtils.VectorToAngle(pos), radarBlip.Draw(spriteBatch, center + pos, color * 0.5f, radarBlip.Origin, 0, scale * 0.08f, SpriteEffects.None, 0);
new Vector2(scale * 0.3f, scale) * 0.08f, SpriteEffects.None, 0);
} }
private void DrawMarker(SpriteBatch spriteBatch, string label, Vector2 position, float scale, Vector2 center, float radius) private void DrawMarker(SpriteBatch spriteBatch, string label, Vector2 position, float scale, Vector2 center, float radius)
{ {
//position += Level.Loaded.Position;
float dist = position.Length(); float dist = position.Length();
position *= scale; position *= scale;
@@ -401,7 +425,6 @@ namespace Barotrauma.Items.Components
if (dir.X < 0.0f) markerPos.X -= GUI.SmallFont.MeasureString(label).X + 10; if (dir.X < 0.0f) markerPos.X -= GUI.SmallFont.MeasureString(label).X + 10;
string wrappedLabel = ToolBox.WrapText(label, 150, GUI.SmallFont); string wrappedLabel = ToolBox.WrapText(label, 150, GUI.SmallFont);
wrappedLabel += "\n" + ((int)(dist * Physics.DisplayToRealWorldRatio) + " m"); wrappedLabel += "\n" + ((int)(dist * Physics.DisplayToRealWorldRatio) + " m");
GUI.DrawString(spriteBatch, GUI.DrawString(spriteBatch,
@@ -433,11 +456,13 @@ namespace Barotrauma.Items.Components
{ {
public float FadeTimer; public float FadeTimer;
public Vector2 Position; public Vector2 Position;
public float Scale;
public RadarBlip(Vector2 pos, float fadeTimer) public RadarBlip(Vector2 pos, float fadeTimer, float scale)
{ {
Position = pos; Position = pos;
FadeTimer = Math.Max(fadeTimer, 0.0f); FadeTimer = Math.Max(fadeTimer, 0.0f);
Scale = scale;
} }
} }
} }