From c4bcf0af469e43c653b7b006f99cdb9df0b0ea7a Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Tue, 22 Jul 2014 17:06:28 +1200 Subject: [PATCH] Introduce RangeCircleRenderable. --- OpenRA.Game/Graphics/WorldRenderer.cs | 11 ---- OpenRA.Mods.RA/Buildings/BaseProvider.cs | 6 +- .../Graphics/RangeCircleRenderable.cs | 59 +++++++++++++++++++ OpenRA.Mods.RA/OpenRA.Mods.RA.csproj | 1 + OpenRA.Mods.RA/PortableChrono.cs | 6 +- OpenRA.Mods.RA/RenderDetectionCircle.cs | 7 ++- OpenRA.Mods.RA/RenderJammerCircle.cs | 6 +- OpenRA.Mods.RA/RenderRangeCircle.cs | 11 ++-- OpenRA.Mods.RA/RenderShroudCircle.cs | 11 ++-- 9 files changed, 91 insertions(+), 27 deletions(-) create mode 100644 OpenRA.Mods.RA/Graphics/RangeCircleRenderable.cs diff --git a/OpenRA.Game/Graphics/WorldRenderer.cs b/OpenRA.Game/Graphics/WorldRenderer.cs index a92a1f9485..4e4364e40d 100644 --- a/OpenRA.Game/Graphics/WorldRenderer.cs +++ b/OpenRA.Game/Graphics/WorldRenderer.cs @@ -199,17 +199,6 @@ namespace OpenRA.Graphics } } - public void DrawRangeCircleWithContrast(WPos pos, WRange range, Color fg, Color bg) - { - var wlr = Game.Renderer.WorldLineRenderer; - var oldWidth = wlr.LineWidth; - wlr.LineWidth = 3; - DrawRangeCircle(pos, range, bg); - wlr.LineWidth = 1; - DrawRangeCircle(pos, range, fg); - wlr.LineWidth = oldWidth; - } - public void DrawTargetMarker(Color c, float2 location) { var tl = new float2(-1 / Viewport.Zoom, -1 / Viewport.Zoom); diff --git a/OpenRA.Mods.RA/Buildings/BaseProvider.cs b/OpenRA.Mods.RA/Buildings/BaseProvider.cs index 6d55c9e929..55754486db 100755 --- a/OpenRA.Mods.RA/Buildings/BaseProvider.cs +++ b/OpenRA.Mods.RA/Buildings/BaseProvider.cs @@ -10,6 +10,7 @@ using System.Drawing; using OpenRA.Graphics; +using OpenRA.Mods.RA.Graphics; using OpenRA.Traits; namespace OpenRA.Mods.RA.Buildings @@ -68,12 +69,13 @@ namespace OpenRA.Mods.RA.Buildings if (!ValidRenderPlayer()) return; - wr.DrawRangeCircleWithContrast( + new RangeCircleRenderable( self.CenterPosition, WRange.FromCells(Info.Range), + 0, Color.FromArgb(128, Ready() ? Color.White : Color.Red), Color.FromArgb(96, Color.Black) - ); + ).Render(wr); } // Selection bar diff --git a/OpenRA.Mods.RA/Graphics/RangeCircleRenderable.cs b/OpenRA.Mods.RA/Graphics/RangeCircleRenderable.cs new file mode 100644 index 0000000000..1040a219a9 --- /dev/null +++ b/OpenRA.Mods.RA/Graphics/RangeCircleRenderable.cs @@ -0,0 +1,59 @@ +#region Copyright & License Information +/* + * Copyright 2007-2014 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.RA.Graphics +{ + public struct RangeCircleRenderable : IRenderable + { + readonly WPos centerPosition; + readonly WRange radius; + readonly int zOffset; + readonly Color color; + readonly Color contrastColor; + + public RangeCircleRenderable(WPos centerPosition, WRange radius, int zOffset, Color color, Color contrastColor) + { + this.centerPosition = centerPosition; + this.radius = radius; + this.zOffset = zOffset; + this.color = color; + this.contrastColor = contrastColor; + } + + public WPos Pos { get { return centerPosition; } } + public float Scale { get { return 1f; } } + public PaletteReference Palette { get { return null; } } + public int ZOffset { get { return zOffset; } } + public bool IsDecoration { get { return true; } } + + public IRenderable WithScale(float newScale) { return new RangeCircleRenderable(centerPosition, radius, zOffset, color, contrastColor); } + public IRenderable WithPalette(PaletteReference newPalette) { return new RangeCircleRenderable(centerPosition, radius, zOffset, color, contrastColor); } + public IRenderable WithZOffset(int newOffset) { return new RangeCircleRenderable(centerPosition, radius, newOffset, color, contrastColor); } + public IRenderable OffsetBy(WVec vec) { return new RangeCircleRenderable(centerPosition + vec, radius, zOffset, color, contrastColor); } + public IRenderable AsDecoration() { return this; } + + public void BeforeRender(WorldRenderer wr) {} + public void Render(WorldRenderer wr) + { + var wlr = Game.Renderer.WorldLineRenderer; + var oldWidth = wlr.LineWidth; + wlr.LineWidth = 3; + wr.DrawRangeCircle(centerPosition, radius, contrastColor); + wlr.LineWidth = 1; + wr.DrawRangeCircle(centerPosition, radius, color); + wlr.LineWidth = oldWidth; + } + + public void RenderDebugGeometry(WorldRenderer wr) {} + } +} diff --git a/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj b/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj index fb71ed70f5..42e4037688 100644 --- a/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj +++ b/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj @@ -530,6 +530,7 @@ + diff --git a/OpenRA.Mods.RA/PortableChrono.cs b/OpenRA.Mods.RA/PortableChrono.cs index 0107eb42d3..e202380d27 100644 --- a/OpenRA.Mods.RA/PortableChrono.cs +++ b/OpenRA.Mods.RA/PortableChrono.cs @@ -12,6 +12,7 @@ using System.Collections.Generic; using System.Drawing; using OpenRA.Graphics; using OpenRA.Mods.RA.Activities; +using OpenRA.Mods.RA.Graphics; using OpenRA.Mods.RA.Orders; using OpenRA.Traits; @@ -180,12 +181,13 @@ namespace OpenRA.Mods.RA if (!self.Trait().Info.HasDistanceLimit) return; - wr.DrawRangeCircleWithContrast( + new RangeCircleRenderable( self.CenterPosition, WRange.FromCells(self.Trait().Info.MaxDistance), + 0, Color.FromArgb(128, Color.LawnGreen), Color.FromArgb(96, Color.Black) - ); + ).Render(wr); } public string GetCursor(World world, CPos xy, MouseInput mi) diff --git a/OpenRA.Mods.RA/RenderDetectionCircle.cs b/OpenRA.Mods.RA/RenderDetectionCircle.cs index 8c566e3edc..962a409f64 100644 --- a/OpenRA.Mods.RA/RenderDetectionCircle.cs +++ b/OpenRA.Mods.RA/RenderDetectionCircle.cs @@ -10,6 +10,7 @@ using System.Drawing; using OpenRA.Graphics; +using OpenRA.Mods.RA.Graphics; using OpenRA.Traits; namespace OpenRA.Mods.RA @@ -30,11 +31,13 @@ namespace OpenRA.Mods.RA if (self.Owner != self.World.LocalPlayer) return; - wr.DrawRangeCircleWithContrast( + new RangeCircleRenderable( self.CenterPosition, WRange.FromCells(self.Info.Traits.Get().Range), + 0, Color.FromArgb(128, Color.LimeGreen), - Color.FromArgb(96, Color.Black)); + Color.FromArgb(96, Color.Black) + ).Render(wr); } } } diff --git a/OpenRA.Mods.RA/RenderJammerCircle.cs b/OpenRA.Mods.RA/RenderJammerCircle.cs index 29878fb61b..c473d13e7b 100644 --- a/OpenRA.Mods.RA/RenderJammerCircle.cs +++ b/OpenRA.Mods.RA/RenderJammerCircle.cs @@ -10,6 +10,7 @@ using System.Drawing; using OpenRA.Graphics; +using OpenRA.Mods.RA.Graphics; using OpenRA.Traits; namespace OpenRA.Mods.RA @@ -57,12 +58,13 @@ namespace OpenRA.Mods.RA public static void DrawRangeCircle(WorldRenderer wr, WPos pos, int range, Color color) { - wr.DrawRangeCircleWithContrast( + new RangeCircleRenderable( pos, WRange.FromCells(range), + 0, Color.FromArgb(128, color), Color.FromArgb(96, Color.Black) - ); + ).Render(wr); } } } diff --git a/OpenRA.Mods.RA/RenderRangeCircle.cs b/OpenRA.Mods.RA/RenderRangeCircle.cs index 90c0b58597..728c40c8a6 100644 --- a/OpenRA.Mods.RA/RenderRangeCircle.cs +++ b/OpenRA.Mods.RA/RenderRangeCircle.cs @@ -11,6 +11,7 @@ using System.Drawing; using System.Linq; using OpenRA.Graphics; +using OpenRA.Mods.RA.Graphics; using OpenRA.Traits; namespace OpenRA.Mods.RA @@ -39,12 +40,13 @@ namespace OpenRA.Mods.RA if (range == WRange.Zero) return; - wr.DrawRangeCircleWithContrast( + new RangeCircleRenderable( centerPosition, range, + 0, Color.FromArgb(128, Color.Yellow), Color.FromArgb(96, Color.Black) - ); + ).Render(wr); foreach (var a in w.ActorsWithTrait()) if (a.Actor.Owner == a.Actor.World.LocalPlayer) @@ -71,12 +73,13 @@ namespace OpenRA.Mods.RA if (self.Owner != self.World.LocalPlayer) return; - wr.DrawRangeCircleWithContrast( + new RangeCircleRenderable( self.CenterPosition, attack.GetMaximumRange(), + 0, Color.FromArgb(128, Color.Yellow), Color.FromArgb(96, Color.Black) - ); + ).Render(wr); } } } diff --git a/OpenRA.Mods.RA/RenderShroudCircle.cs b/OpenRA.Mods.RA/RenderShroudCircle.cs index 58e7e787a5..9dbfaf68d1 100644 --- a/OpenRA.Mods.RA/RenderShroudCircle.cs +++ b/OpenRA.Mods.RA/RenderShroudCircle.cs @@ -10,6 +10,7 @@ using System.Drawing; using OpenRA.Graphics; +using OpenRA.Mods.RA.Graphics; using OpenRA.Traits; namespace OpenRA.Mods.RA @@ -18,12 +19,13 @@ namespace OpenRA.Mods.RA { public void Render(WorldRenderer wr, World w, ActorInfo ai, WPos centerPosition) { - wr.DrawRangeCircleWithContrast( + new RangeCircleRenderable( centerPosition, ai.Traits.Get().Range, + 0, Color.FromArgb(128, Color.Cyan), Color.FromArgb(96, Color.Black) - ); + ).Render(wr); foreach (var a in w.ActorsWithTrait()) if (a.Actor.Owner == a.Actor.World.LocalPlayer) @@ -44,12 +46,13 @@ namespace OpenRA.Mods.RA if (self.Owner != self.World.LocalPlayer) return; - wr.DrawRangeCircleWithContrast( + new RangeCircleRenderable( self.CenterPosition, self.Info.Traits.Get().Range, + 0, Color.FromArgb(128, Color.Cyan), Color.FromArgb(96, Color.Black) - ); + ).Render(wr); } } }