From 2c4e6c4188f2f6a61bdd236d7aacd9522a3ac478 Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Sun, 22 Mar 2020 12:24:34 +0000 Subject: [PATCH] Remove special-case rollover rendering. --- OpenRA.Game/Traits/TraitsInterfaces.cs | 3 ++- .../Traits/Render/SelectionDecorationsBase.cs | 17 +++++------------ OpenRA.Mods.Common/Traits/World/Selection.cs | 12 ++++++++++++ .../WorldInteractionControllerWidget.cs | 19 +++++-------------- 4 files changed, 24 insertions(+), 27 deletions(-) diff --git a/OpenRA.Game/Traits/TraitsInterfaces.cs b/OpenRA.Game/Traits/TraitsInterfaces.cs index fa6792ff56..99f9e7e1fd 100644 --- a/OpenRA.Game/Traits/TraitsInterfaces.cs +++ b/OpenRA.Game/Traits/TraitsInterfaces.cs @@ -266,7 +266,6 @@ namespace OpenRA.Traits public interface ISelectionDecorations { - IEnumerable RenderRolloverAnnotations(Actor self, WorldRenderer worldRenderer); IEnumerable RenderSelectionAnnotations(Actor self, WorldRenderer worldRenderer, Color color); } @@ -433,6 +432,8 @@ namespace OpenRA.Traits bool Contains(Actor a); void Combine(World world, IEnumerable newSelection, bool isCombine, bool isClick); void Clear(); + bool RolloverContains(Actor a); + void SetRollover(IEnumerable actors); void DoControlGroup(World world, WorldRenderer worldRenderer, int group, Modifiers mods, int multiTapCount); void AddToControlGroup(Actor a, int group); void RemoveFromControlGroup(Actor a); diff --git a/OpenRA.Mods.Common/Traits/Render/SelectionDecorationsBase.cs b/OpenRA.Mods.Common/Traits/Render/SelectionDecorationsBase.cs index 61118efdf6..dc034c9065 100644 --- a/OpenRA.Mods.Common/Traits/Render/SelectionDecorationsBase.cs +++ b/OpenRA.Mods.Common/Traits/Render/SelectionDecorationsBase.cs @@ -85,20 +85,21 @@ namespace OpenRA.Mods.Common.Traits.Render IEnumerable DrawDecorations(Actor self, WorldRenderer wr) { var selected = self.World.Selection.Contains(self); + var rollover = self.World.Selection.RolloverContains(self); var regularWorld = self.World.Type == WorldType.Regular; var statusBars = Game.Settings.Game.StatusBars; // Health bars are shown when: - // * actor is selected + // * actor is selected / in active drag rectangle / under the mouse // * status bar preference is set to "always show" // * status bar preference is set to "when damaged" and actor is damaged - var displayHealth = selected || (regularWorld && statusBars == StatusBarsType.AlwaysShow) + var displayHealth = selected || rollover || (regularWorld && statusBars == StatusBarsType.AlwaysShow) || (regularWorld && statusBars == StatusBarsType.DamageShow && self.GetDamageState() != DamageState.Undamaged); // Extra bars are shown when: - // * actor is selected + // * actor is selected / in active drag rectangle / under the mouse // * status bar preference is set to "always show" or "when damaged" - var displayExtra = selected || (regularWorld && statusBars != StatusBarsType.Standard); + var displayExtra = selected || rollover || (regularWorld && statusBars != StatusBarsType.Standard); if (selected) foreach (var r in RenderSelectionBox(self, wr, info.SelectionBoxColor)) @@ -125,14 +126,6 @@ namespace OpenRA.Mods.Common.Traits.Render yield return new TargetLineRenderable(ActivityTargetPath(self), Color.Green); } - IEnumerable ISelectionDecorations.RenderRolloverAnnotations(Actor self, WorldRenderer worldRenderer) - { - if (self.World.Selection.Contains(self)) - return Enumerable.Empty(); - - return RenderSelectionBars(self, worldRenderer, true, true); - } - IEnumerable ISelectionDecorations.RenderSelectionAnnotations(Actor self, WorldRenderer worldRenderer, Color color) { return RenderSelectionBox(self, worldRenderer, color); diff --git a/OpenRA.Mods.Common/Traits/World/Selection.cs b/OpenRA.Mods.Common/Traits/World/Selection.cs index 16f27f790a..e143a8ef47 100644 --- a/OpenRA.Mods.Common/Traits/World/Selection.cs +++ b/OpenRA.Mods.Common/Traits/World/Selection.cs @@ -28,6 +28,8 @@ namespace OpenRA.Mods.Common.Traits public IEnumerable Actors { get { return actors; } } readonly HashSet actors = new HashSet(); + IEnumerable rolloverActors; + INotifySelection[] worldNotifySelection; public Selection(SelectionInfo info) { } @@ -143,6 +145,16 @@ namespace OpenRA.Mods.Common.Traits UpdateHash(); } + public void SetRollover(IEnumerable rollover) + { + rolloverActors = rollover; + } + + public bool RolloverContains(Actor a) + { + return rolloverActors != null && rolloverActors.Contains(a); + } + void ITick.Tick(Actor self) { var removed = actors.RemoveWhere(a => !a.IsInWorld || (!a.Owner.IsAlliedWith(self.World.RenderPlayer) && self.World.FogObscures(a))); diff --git a/OpenRA.Mods.Common/Widgets/WorldInteractionControllerWidget.cs b/OpenRA.Mods.Common/Widgets/WorldInteractionControllerWidget.cs index 7b297ff016..12cb1665a8 100644 --- a/OpenRA.Mods.Common/Widgets/WorldInteractionControllerWidget.cs +++ b/OpenRA.Mods.Common/Widgets/WorldInteractionControllerWidget.cs @@ -58,19 +58,10 @@ namespace OpenRA.Mods.Common.Widgets normalSelectionColor = Color.White; } - void DrawRollover(Actor unit) - { - var selectionDecorations = unit.TraitOrDefault(); - if (selectionDecorations == null) - return; - - foreach (var r in selectionDecorations.RenderRolloverAnnotations(unit, worldRenderer)) - r.PrepareRender(worldRenderer).Render(worldRenderer); - } - public override void Draw() { var modifiers = Game.GetModifierKeys(); + IEnumerable rollover; if (IsValidDragbox) { var a = worldRenderer.Viewport.WorldToViewPx(dragStart); @@ -85,15 +76,15 @@ namespace OpenRA.Mods.Common.Widgets Game.Renderer.RgbaColorRenderer.DrawRect(a, b, 1, color); // Render actors in the dragbox - foreach (var u in SelectActorsInBoxWithDeadzone(World, dragStart, mousePos, modifiers)) - DrawRollover(u); + rollover = SelectActorsInBoxWithDeadzone(World, dragStart, mousePos, modifiers); } else { // Render actors under the mouse pointer - foreach (var u in SelectActorsInBoxWithDeadzone(World, mousePos, mousePos, modifiers)) - DrawRollover(u); + rollover = SelectActorsInBoxWithDeadzone(World, mousePos, mousePos, modifiers); } + + worldRenderer.World.Selection.SetRollover(rollover); } public override bool HandleMouseInput(MouseInput mi)