diff --git a/OpenRA.Mods.Common/Graphics/DetectionCircleRenderable.cs b/OpenRA.Mods.Common/Graphics/DetectionCircleRenderable.cs
new file mode 100644
index 0000000000..4a245160da
--- /dev/null
+++ b/OpenRA.Mods.Common/Graphics/DetectionCircleRenderable.cs
@@ -0,0 +1,88 @@
+#region Copyright & License Information
+/*
+ * Copyright 2007-2015 The OpenRA Developers (see AUTHORS)
+ * This file is part of OpenRA, which is free software. It is made
+ * available to you under the terms of the GNU General Public License
+ * as published by the Free Software Foundation. For more information,
+ * see COPYING.
+ */
+#endregion
+
+using System.Drawing;
+using OpenRA.Graphics;
+
+namespace OpenRA.Mods.Common.Graphics
+{
+ public struct DetectionCircleRenderable : IRenderable, IFinalizedRenderable
+ {
+ readonly WPos centerPosition;
+ readonly WDist radius;
+ readonly int zOffset;
+ readonly int trailCount;
+ readonly WAngle trailSeparation;
+ readonly WAngle trailAngle;
+ readonly Color color;
+ readonly Color contrastColor;
+
+ public DetectionCircleRenderable(WPos centerPosition, WDist radius, int zOffset,
+ int lineTrails, WAngle trailSeparation, WAngle trailAngle, Color color, Color contrastColor)
+ {
+ this.centerPosition = centerPosition;
+ this.radius = radius;
+ this.zOffset = zOffset;
+ this.trailCount = lineTrails;
+ this.trailSeparation = trailSeparation;
+ this.trailAngle = trailAngle;
+ this.color = color;
+ this.contrastColor = contrastColor;
+ }
+
+ public WPos Pos { get { return centerPosition; } }
+ public PaletteReference Palette { get { return null; } }
+ public int ZOffset { get { return zOffset; } }
+ public bool IsDecoration { get { return true; } }
+
+ public IRenderable WithPalette(PaletteReference newPalette)
+ {
+ return new DetectionCircleRenderable(centerPosition, radius, zOffset,
+ trailCount, trailAngle, trailSeparation, color, contrastColor);
+ }
+
+ public IRenderable WithZOffset(int newOffset)
+ {
+ return new DetectionCircleRenderable(centerPosition, radius, newOffset,
+ trailCount, trailAngle, trailSeparation, color, contrastColor);
+ }
+
+ public IRenderable OffsetBy(WVec vec)
+ {
+ return new DetectionCircleRenderable(centerPosition + vec, radius, zOffset,
+ trailCount, trailAngle, trailSeparation, color, contrastColor);
+ }
+
+ public IRenderable AsDecoration() { return this; }
+
+ public IFinalizedRenderable PrepareRender(WorldRenderer wr) { return this; }
+ public void Render(WorldRenderer wr)
+ {
+ var wcr = Game.Renderer.WorldRgbaColorRenderer;
+ var center = wr.ScreenPosition(centerPosition);
+
+ for (var i = 0; i < trailCount; i++)
+ {
+ var angle = trailAngle - new WAngle(i * (trailSeparation.Angle <= 512 ? 1 : -1));
+ var length = radius.Length * new WVec(angle.Cos(), angle.Sin(), 0) / 1024;
+ var end = wr.ScreenPosition(centerPosition + length);
+ var alpha = color.A - i * color.A / trailCount;
+
+ wcr.DrawLine(center, end, 3, Color.FromArgb(alpha, contrastColor));
+ wcr.DrawLine(center, end, 1, Color.FromArgb(alpha, color));
+ }
+
+ RangeCircleRenderable.DrawRangeCircle(wr, centerPosition, radius, 1, color, 3, contrastColor);
+ }
+
+ public void RenderDebugGeometry(WorldRenderer wr) { }
+ public Rectangle ScreenBounds(WorldRenderer wr) { return Rectangle.Empty; }
+ }
+}
diff --git a/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj b/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj
index c440f61bda..ee5846cd43 100644
--- a/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj
+++ b/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj
@@ -713,6 +713,7 @@
+
diff --git a/OpenRA.Mods.Common/Traits/Render/RenderDetectionCircle.cs b/OpenRA.Mods.Common/Traits/Render/RenderDetectionCircle.cs
index 91660fb215..1331a066b7 100644
--- a/OpenRA.Mods.Common/Traits/Render/RenderDetectionCircle.cs
+++ b/OpenRA.Mods.Common/Traits/Render/RenderDetectionCircle.cs
@@ -19,14 +19,11 @@ namespace OpenRA.Mods.Common.Traits
{
class RenderDetectionCircleInfo : ITraitInfo, Requires
{
- [Desc("Draw a rotating radar scanner update line, disabled by default.")]
- public readonly bool DrawUpdateLine = false;
-
[Desc("WAngle the Radar update line advances per tick.")]
public readonly WAngle UpdateLineTick = new WAngle(-1);
- [Desc("Number of trailing Radar update lines, will only draw one line if zero.")]
- public readonly int LineTrailLength = 3;
+ [Desc("Number of trailing Radar update lines.")]
+ public readonly int TrailCount = 0;
[Desc("Color of the circle and scanner update line.")]
public readonly Color Color = Color.FromArgb(128, Color.LimeGreen);
@@ -62,34 +59,15 @@ namespace OpenRA.Mods.Common.Traits
if (range == WDist.Zero)
yield break;
- yield return new RangeCircleRenderable(
+ yield return new DetectionCircleRenderable(
self.CenterPosition,
range,
0,
+ info.TrailCount,
+ info.UpdateLineTick,
+ lineAngle,
info.Color,
info.ContrastColor);
-
- if (info.DrawUpdateLine)
- {
- for (var i = info.LineTrailLength; i >= 0; i--)
- {
- var angle = lineAngle - new WAngle(i * (info.UpdateLineTick.Angle <= 512 ? 1 : -1));
- var length = range.Length * new WVec(angle.Cos(), angle.Sin(), 0) / 1024;
- var alpha = info.Color.A - (info.LineTrailLength > 0 ? i * info.Color.A / info.LineTrailLength : 0);
- yield return new BeamRenderable(
- self.CenterPosition,
- 0,
- length,
- 3,
- Color.FromArgb(alpha, info.ContrastColor));
- yield return new BeamRenderable(
- self.CenterPosition,
- 0,
- length,
- 1,
- Color.FromArgb(alpha, info.Color));
- }
- }
}
public void Tick(Actor self)
diff --git a/mods/ts/rules/shared-vehicles.yaml b/mods/ts/rules/shared-vehicles.yaml
index caf38fc2cb..7be1f5b432 100644
--- a/mods/ts/rules/shared-vehicles.yaml
+++ b/mods/ts/rules/shared-vehicles.yaml
@@ -146,5 +146,5 @@ LPST:
UpgradeMinEnabledLevel: 1
Range: 18c0
RenderDetectionCircle:
- DrawUpdateLine: true
+ TrailCount: 3