Remove special-case rollover rendering.

This commit is contained in:
Paul Chote
2020-03-22 12:24:34 +00:00
committed by atlimit8
parent 9f3254dbd1
commit 2c4e6c4188
4 changed files with 24 additions and 27 deletions

View File

@@ -266,7 +266,6 @@ namespace OpenRA.Traits
public interface ISelectionDecorations public interface ISelectionDecorations
{ {
IEnumerable<IRenderable> RenderRolloverAnnotations(Actor self, WorldRenderer worldRenderer);
IEnumerable<IRenderable> RenderSelectionAnnotations(Actor self, WorldRenderer worldRenderer, Color color); IEnumerable<IRenderable> RenderSelectionAnnotations(Actor self, WorldRenderer worldRenderer, Color color);
} }
@@ -433,6 +432,8 @@ namespace OpenRA.Traits
bool Contains(Actor a); bool Contains(Actor a);
void Combine(World world, IEnumerable<Actor> newSelection, bool isCombine, bool isClick); void Combine(World world, IEnumerable<Actor> newSelection, bool isCombine, bool isClick);
void Clear(); void Clear();
bool RolloverContains(Actor a);
void SetRollover(IEnumerable<Actor> actors);
void DoControlGroup(World world, WorldRenderer worldRenderer, int group, Modifiers mods, int multiTapCount); void DoControlGroup(World world, WorldRenderer worldRenderer, int group, Modifiers mods, int multiTapCount);
void AddToControlGroup(Actor a, int group); void AddToControlGroup(Actor a, int group);
void RemoveFromControlGroup(Actor a); void RemoveFromControlGroup(Actor a);

View File

@@ -85,20 +85,21 @@ namespace OpenRA.Mods.Common.Traits.Render
IEnumerable<IRenderable> DrawDecorations(Actor self, WorldRenderer wr) IEnumerable<IRenderable> DrawDecorations(Actor self, WorldRenderer wr)
{ {
var selected = self.World.Selection.Contains(self); var selected = self.World.Selection.Contains(self);
var rollover = self.World.Selection.RolloverContains(self);
var regularWorld = self.World.Type == WorldType.Regular; var regularWorld = self.World.Type == WorldType.Regular;
var statusBars = Game.Settings.Game.StatusBars; var statusBars = Game.Settings.Game.StatusBars;
// Health bars are shown when: // 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 "always show"
// * status bar preference is set to "when damaged" and actor is damaged // * 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); || (regularWorld && statusBars == StatusBarsType.DamageShow && self.GetDamageState() != DamageState.Undamaged);
// Extra bars are shown when: // 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" // * 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) if (selected)
foreach (var r in RenderSelectionBox(self, wr, info.SelectionBoxColor)) 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); yield return new TargetLineRenderable(ActivityTargetPath(self), Color.Green);
} }
IEnumerable<IRenderable> ISelectionDecorations.RenderRolloverAnnotations(Actor self, WorldRenderer worldRenderer)
{
if (self.World.Selection.Contains(self))
return Enumerable.Empty<IRenderable>();
return RenderSelectionBars(self, worldRenderer, true, true);
}
IEnumerable<IRenderable> ISelectionDecorations.RenderSelectionAnnotations(Actor self, WorldRenderer worldRenderer, Color color) IEnumerable<IRenderable> ISelectionDecorations.RenderSelectionAnnotations(Actor self, WorldRenderer worldRenderer, Color color)
{ {
return RenderSelectionBox(self, worldRenderer, color); return RenderSelectionBox(self, worldRenderer, color);

View File

@@ -28,6 +28,8 @@ namespace OpenRA.Mods.Common.Traits
public IEnumerable<Actor> Actors { get { return actors; } } public IEnumerable<Actor> Actors { get { return actors; } }
readonly HashSet<Actor> actors = new HashSet<Actor>(); readonly HashSet<Actor> actors = new HashSet<Actor>();
IEnumerable<Actor> rolloverActors;
INotifySelection[] worldNotifySelection; INotifySelection[] worldNotifySelection;
public Selection(SelectionInfo info) { } public Selection(SelectionInfo info) { }
@@ -143,6 +145,16 @@ namespace OpenRA.Mods.Common.Traits
UpdateHash(); UpdateHash();
} }
public void SetRollover(IEnumerable<Actor> rollover)
{
rolloverActors = rollover;
}
public bool RolloverContains(Actor a)
{
return rolloverActors != null && rolloverActors.Contains(a);
}
void ITick.Tick(Actor self) void ITick.Tick(Actor self)
{ {
var removed = actors.RemoveWhere(a => !a.IsInWorld || (!a.Owner.IsAlliedWith(self.World.RenderPlayer) && self.World.FogObscures(a))); var removed = actors.RemoveWhere(a => !a.IsInWorld || (!a.Owner.IsAlliedWith(self.World.RenderPlayer) && self.World.FogObscures(a)));

View File

@@ -58,19 +58,10 @@ namespace OpenRA.Mods.Common.Widgets
normalSelectionColor = Color.White; normalSelectionColor = Color.White;
} }
void DrawRollover(Actor unit)
{
var selectionDecorations = unit.TraitOrDefault<ISelectionDecorations>();
if (selectionDecorations == null)
return;
foreach (var r in selectionDecorations.RenderRolloverAnnotations(unit, worldRenderer))
r.PrepareRender(worldRenderer).Render(worldRenderer);
}
public override void Draw() public override void Draw()
{ {
var modifiers = Game.GetModifierKeys(); var modifiers = Game.GetModifierKeys();
IEnumerable<Actor> rollover;
if (IsValidDragbox) if (IsValidDragbox)
{ {
var a = worldRenderer.Viewport.WorldToViewPx(dragStart); var a = worldRenderer.Viewport.WorldToViewPx(dragStart);
@@ -85,15 +76,15 @@ namespace OpenRA.Mods.Common.Widgets
Game.Renderer.RgbaColorRenderer.DrawRect(a, b, 1, color); Game.Renderer.RgbaColorRenderer.DrawRect(a, b, 1, color);
// Render actors in the dragbox // Render actors in the dragbox
foreach (var u in SelectActorsInBoxWithDeadzone(World, dragStart, mousePos, modifiers)) rollover = SelectActorsInBoxWithDeadzone(World, dragStart, mousePos, modifiers);
DrawRollover(u);
} }
else else
{ {
// Render actors under the mouse pointer // Render actors under the mouse pointer
foreach (var u in SelectActorsInBoxWithDeadzone(World, mousePos, mousePos, modifiers)) rollover = SelectActorsInBoxWithDeadzone(World, mousePos, mousePos, modifiers);
DrawRollover(u);
} }
worldRenderer.World.Selection.SetRollover(rollover);
} }
public override bool HandleMouseInput(MouseInput mi) public override bool HandleMouseInput(MouseInput mi)