From 1a313689537aa5864c9811135ee2e95d2d6aba3c Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Tue, 24 Dec 2013 10:56:49 +1300 Subject: [PATCH] Convert range circle rendering to world coords. --- OpenRA.Game/Graphics/WorldRenderer.cs | 16 ++++++++-------- OpenRA.Mods.RA/Buildings/BaseProvider.cs | 6 ++++-- OpenRA.Mods.RA/ChronoshiftDeploy.cs | 7 +++++-- OpenRA.Mods.RA/CombatDebugOverlay.cs | 5 ++++- OpenRA.Mods.RA/RenderDetectionCircle.cs | 3 ++- OpenRA.Mods.RA/RenderJammerCircle.cs | 7 ++++--- OpenRA.Mods.RA/RenderRangeCircle.cs | 20 ++++++++++++-------- OpenRA.Mods.RA/RenderShroudCircle.cs | 13 ++++++++----- 8 files changed, 47 insertions(+), 30 deletions(-) diff --git a/OpenRA.Game/Graphics/WorldRenderer.cs b/OpenRA.Game/Graphics/WorldRenderer.cs index c4a6c96679..61f4389544 100644 --- a/OpenRA.Game/Graphics/WorldRenderer.cs +++ b/OpenRA.Game/Graphics/WorldRenderer.cs @@ -190,25 +190,25 @@ namespace OpenRA.Graphics selectable.DrawRollover(this); } - public void DrawRangeCircle(Color c, float2 location, float range) + public void DrawRangeCircle(WPos pos, WRange range, Color c) { + var offset = new WVec(range.Range, 0, 0); for (var i = 0; i < 32; i++) { - var start = location + Game.CellSize * range * float2.FromAngle((float)(Math.PI * i) / 16); - var end = location + Game.CellSize * range * float2.FromAngle((float)(Math.PI * (i + 0.7)) / 16); - - Game.Renderer.WorldLineRenderer.DrawLine(start, end, c, c); + var pa = pos + offset.Rotate(WRot.FromFacing(8 * i)); + var pb = pos + offset.Rotate(WRot.FromFacing(8 * i + 6)); + Game.Renderer.WorldLineRenderer.DrawLine(ScreenPosition(pa), ScreenPosition(pb), c, c); } } - public void DrawRangeCircleWithContrast(Color fg, float2 location, float range, Color bg) + public void DrawRangeCircleWithContrast(WPos pos, WRange range, Color fg, Color bg) { var wlr = Game.Renderer.WorldLineRenderer; var oldWidth = wlr.LineWidth; wlr.LineWidth = 3; - DrawRangeCircle(bg, location, range); + DrawRangeCircle(pos, range, bg); wlr.LineWidth = 1; - DrawRangeCircle(fg, location, range); + DrawRangeCircle(pos, range, fg); wlr.LineWidth = oldWidth; } diff --git a/OpenRA.Mods.RA/Buildings/BaseProvider.cs b/OpenRA.Mods.RA/Buildings/BaseProvider.cs index 9a84a353e1..6d55c9e929 100755 --- a/OpenRA.Mods.RA/Buildings/BaseProvider.cs +++ b/OpenRA.Mods.RA/Buildings/BaseProvider.cs @@ -69,9 +69,11 @@ namespace OpenRA.Mods.RA.Buildings return; wr.DrawRangeCircleWithContrast( + self.CenterPosition, + WRange.FromCells(Info.Range), Color.FromArgb(128, Ready() ? Color.White : Color.Red), - wr.ScreenPxPosition(self.CenterPosition), Info.Range, - Color.FromArgb(96, Color.Black)); + Color.FromArgb(96, Color.Black) + ); } // Selection bar diff --git a/OpenRA.Mods.RA/ChronoshiftDeploy.cs b/OpenRA.Mods.RA/ChronoshiftDeploy.cs index 1cf52d50b8..d6ab9cee87 100644 --- a/OpenRA.Mods.RA/ChronoshiftDeploy.cs +++ b/OpenRA.Mods.RA/ChronoshiftDeploy.cs @@ -152,9 +152,12 @@ namespace OpenRA.Mods.RA if (self.Owner != self.World.LocalPlayer) return; - wr.DrawRangeCircle( + wr.DrawRangeCircleWithContrast( + self.CenterPosition, + WRange.FromCells(self.Trait().Info.JumpDistance), Color.FromArgb(128, Color.DeepSkyBlue), - wr.ScreenPxPosition(self.CenterPosition), (int)self.Trait().Info.JumpDistance); + Color.FromArgb(96, Color.Black) + ); } } } diff --git a/OpenRA.Mods.RA/CombatDebugOverlay.cs b/OpenRA.Mods.RA/CombatDebugOverlay.cs index 89c8523580..10721b1bc8 100755 --- a/OpenRA.Mods.RA/CombatDebugOverlay.cs +++ b/OpenRA.Mods.RA/CombatDebugOverlay.cs @@ -42,7 +42,10 @@ namespace OpenRA.Mods.RA return; if (health.Value != null) - wr.DrawRangeCircle(Color.Red, wr.ScreenPxPosition(self.CenterPosition), health.Value.Info.Radius / Game.CellSize); + { + var range = new WRange((int)(health.Value.Info.Radius * 1024 / Game.CellSize)); + wr.DrawRangeCircle(self.CenterPosition, range, Color.Red); + } var wlr = Game.Renderer.WorldLineRenderer; var c = Color.White; diff --git a/OpenRA.Mods.RA/RenderDetectionCircle.cs b/OpenRA.Mods.RA/RenderDetectionCircle.cs index b2571e4988..8c566e3edc 100644 --- a/OpenRA.Mods.RA/RenderDetectionCircle.cs +++ b/OpenRA.Mods.RA/RenderDetectionCircle.cs @@ -31,8 +31,9 @@ namespace OpenRA.Mods.RA return; wr.DrawRangeCircleWithContrast( + self.CenterPosition, + WRange.FromCells(self.Info.Traits.Get().Range), Color.FromArgb(128, Color.LimeGreen), - wr.ScreenPxPosition(self.CenterPosition), self.Info.Traits.Get().Range, Color.FromArgb(96, Color.Black)); } } diff --git a/OpenRA.Mods.RA/RenderJammerCircle.cs b/OpenRA.Mods.RA/RenderJammerCircle.cs index b036b2a0e6..29878fb61b 100644 --- a/OpenRA.Mods.RA/RenderJammerCircle.cs +++ b/OpenRA.Mods.RA/RenderJammerCircle.cs @@ -58,10 +58,11 @@ namespace OpenRA.Mods.RA public static void DrawRangeCircle(WorldRenderer wr, WPos pos, int range, Color color) { wr.DrawRangeCircleWithContrast( + pos, + WRange.FromCells(range), Color.FromArgb(128, color), - wr.ScreenPxPosition(pos), - range, - Color.FromArgb(96, Color.Black)); + Color.FromArgb(96, Color.Black) + ); } } } diff --git a/OpenRA.Mods.RA/RenderRangeCircle.cs b/OpenRA.Mods.RA/RenderRangeCircle.cs index fae52fa400..253f9712a0 100644 --- a/OpenRA.Mods.RA/RenderRangeCircle.cs +++ b/OpenRA.Mods.RA/RenderRangeCircle.cs @@ -26,11 +26,15 @@ namespace OpenRA.Mods.RA public void Render(WorldRenderer wr, World w, ActorInfo ai, WPos centerPosition) { + var range = ai.Traits.WithInterface() + .Select(a => Rules.Weapons[a.Weapon.ToLowerInvariant()].Range).Max(); + wr.DrawRangeCircleWithContrast( - Color.FromArgb(128, Color.Yellow), wr.ScreenPxPosition(centerPosition), - ai.Traits.WithInterface() - .Select(a => Rules.Weapons[a.Weapon.ToLowerInvariant()].Range).Max(), - Color.FromArgb(96, Color.Black)); + centerPosition, + new WRange((int)(1024 * range)), + Color.FromArgb(128, Color.Yellow), + Color.FromArgb(96, Color.Black) + ); foreach (var a in w.ActorsWithTrait()) if (a.Actor.Owner == a.Actor.World.LocalPlayer) @@ -52,12 +56,12 @@ namespace OpenRA.Mods.RA if (self.Owner != self.World.LocalPlayer) return; - // Hack: Convert world coords to cells - var pxRange = self.Trait().GetMaximumRange().Range / 1024f; wr.DrawRangeCircleWithContrast( + self.CenterPosition, + self.Trait().GetMaximumRange(), Color.FromArgb(128, Color.Yellow), - wr.ScreenPxPosition(self.CenterPosition), pxRange, - Color.FromArgb(96, Color.Black)); + Color.FromArgb(96, Color.Black) + ); } } } diff --git a/OpenRA.Mods.RA/RenderShroudCircle.cs b/OpenRA.Mods.RA/RenderShroudCircle.cs index f348f5f663..cfc2868c90 100644 --- a/OpenRA.Mods.RA/RenderShroudCircle.cs +++ b/OpenRA.Mods.RA/RenderShroudCircle.cs @@ -19,10 +19,11 @@ namespace OpenRA.Mods.RA public void Render(WorldRenderer wr, World w, ActorInfo ai, WPos centerPosition) { wr.DrawRangeCircleWithContrast( + centerPosition, + WRange.FromCells(ai.Traits.Get().Range), Color.FromArgb(128, Color.Cyan), - wr.ScreenPxPosition(centerPosition), - ai.Traits.Get().Range, - Color.FromArgb(96, Color.Black)); + Color.FromArgb(96, Color.Black) + ); foreach (var a in w.ActorsWithTrait()) if (a.Actor.Owner == a.Actor.World.LocalPlayer) @@ -44,9 +45,11 @@ namespace OpenRA.Mods.RA return; wr.DrawRangeCircleWithContrast( + self.CenterPosition, + WRange.FromCells(self.Info.Traits.Get().Range), Color.FromArgb(128, Color.Cyan), - wr.ScreenPxPosition(self.CenterPosition), self.Info.Traits.Get().Range, - Color.FromArgb(96, Color.Black)); + Color.FromArgb(96, Color.Black) + ); } } }