diff --git a/OpenRA.Game/Graphics/WorldRenderer.cs b/OpenRA.Game/Graphics/WorldRenderer.cs index dc8b2ca46f..7798f97bb8 100644 --- a/OpenRA.Game/Graphics/WorldRenderer.cs +++ b/OpenRA.Game/Graphics/WorldRenderer.cs @@ -111,9 +111,6 @@ namespace OpenRA.Graphics worldRenderables = worldRenderables.Concat(World.Effects.SelectMany(e => e.Render(this))); worldRenderables = worldRenderables.OrderBy(RenderableScreenZPositionComparisonKey); - if (World.OrderGenerator != null) - worldRenderables = worldRenderables.Concat(World.OrderGenerator.RenderAfterWorld(this, World)); - Game.Renderer.WorldVoxelRenderer.BeginFrame(); var renderables = worldRenderables.Select(r => r.PrepareRender(this)).ToList(); Game.Renderer.WorldVoxelRenderer.EndFrame(); @@ -185,10 +182,15 @@ namespace OpenRA.Graphics .Where(e => e != null) .SelectMany(e => e.RenderAboveShroud(this)); + var aboveShroudOrderGenerator = SpriteRenderable.None; + if (World.OrderGenerator != null) + aboveShroudOrderGenerator = World.OrderGenerator.RenderAboveShroud(this, World); + Game.Renderer.WorldVoxelRenderer.BeginFrame(); var finalOverlayRenderables = aboveShroud .Concat(aboveShroudSelected) .Concat(aboveShroudEffects) + .Concat(aboveShroudOrderGenerator) .Select(r => r.PrepareRender(this)); Game.Renderer.WorldVoxelRenderer.EndFrame(); diff --git a/OpenRA.Game/Orders/IOrderGenerator.cs b/OpenRA.Game/Orders/IOrderGenerator.cs index 176f76120c..a1fbc999a0 100644 --- a/OpenRA.Game/Orders/IOrderGenerator.cs +++ b/OpenRA.Game/Orders/IOrderGenerator.cs @@ -19,7 +19,7 @@ namespace OpenRA IEnumerable Order(World world, CPos cell, int2 worldPixel, MouseInput mi); void Tick(World world); IEnumerable Render(WorldRenderer wr, World world); - IEnumerable RenderAfterWorld(WorldRenderer wr, World world); + IEnumerable RenderAboveShroud(WorldRenderer wr, World world); string GetCursor(World world, CPos cell, int2 worldPixel, MouseInput mi); } } diff --git a/OpenRA.Game/Orders/UnitOrderGenerator.cs b/OpenRA.Game/Orders/UnitOrderGenerator.cs index 406a63ae02..83945a3437 100644 --- a/OpenRA.Game/Orders/UnitOrderGenerator.cs +++ b/OpenRA.Game/Orders/UnitOrderGenerator.cs @@ -61,7 +61,7 @@ namespace OpenRA.Orders public virtual void Tick(World world) { } public virtual IEnumerable Render(WorldRenderer wr, World world) { yield break; } - public virtual IEnumerable RenderAfterWorld(WorldRenderer wr, World world) { yield break; } + public virtual IEnumerable RenderAboveShroud(WorldRenderer wr, World world) { yield break; } public virtual string GetCursor(World world, CPos cell, int2 worldPixel, MouseInput mi) { diff --git a/OpenRA.Mods.Common/Orders/BeaconOrderGenerator.cs b/OpenRA.Mods.Common/Orders/BeaconOrderGenerator.cs index 95eb41ab8e..d5776f95bc 100644 --- a/OpenRA.Mods.Common/Orders/BeaconOrderGenerator.cs +++ b/OpenRA.Mods.Common/Orders/BeaconOrderGenerator.cs @@ -24,7 +24,7 @@ namespace OpenRA.Mods.Common.Orders public virtual void Tick(World world) { } public IEnumerable Render(WorldRenderer wr, World world) { yield break; } - public IEnumerable RenderAfterWorld(WorldRenderer wr, World world) { yield break; } + public IEnumerable RenderAboveShroud(WorldRenderer wr, World world) { yield break; } public string GetCursor(World world, CPos cell, int2 worldPixel, MouseInput mi) { return "ability"; diff --git a/OpenRA.Mods.Common/Orders/GlobalButtonOrderGenerator.cs b/OpenRA.Mods.Common/Orders/GlobalButtonOrderGenerator.cs index 576c9e4b51..c9b5d6a9cc 100644 --- a/OpenRA.Mods.Common/Orders/GlobalButtonOrderGenerator.cs +++ b/OpenRA.Mods.Common/Orders/GlobalButtonOrderGenerator.cs @@ -62,7 +62,7 @@ namespace OpenRA.Mods.Common.Orders } public IEnumerable Render(WorldRenderer wr, World world) { yield break; } - public IEnumerable RenderAfterWorld(WorldRenderer wr, World world) { yield break; } + public IEnumerable RenderAboveShroud(WorldRenderer wr, World world) { yield break; } public string GetCursor(World world, CPos cell, int2 worldPixel, MouseInput mi) { diff --git a/OpenRA.Mods.Common/Orders/PlaceBuildingOrderGenerator.cs b/OpenRA.Mods.Common/Orders/PlaceBuildingOrderGenerator.cs index c13f360850..e57b72aacf 100644 --- a/OpenRA.Mods.Common/Orders/PlaceBuildingOrderGenerator.cs +++ b/OpenRA.Mods.Common/Orders/PlaceBuildingOrderGenerator.cs @@ -148,7 +148,7 @@ namespace OpenRA.Mods.Common.Orders } public IEnumerable Render(WorldRenderer wr, World world) { yield break; } - public IEnumerable RenderAfterWorld(WorldRenderer wr, World world) + public IEnumerable RenderAboveShroud(WorldRenderer wr, World world) { var xy = wr.Viewport.ViewToWorld(Viewport.LastMousePos); var topLeft = xy - FootprintUtils.AdjustForBuildingSize(buildingInfo); diff --git a/OpenRA.Mods.Common/Orders/RepairOrderGenerator.cs b/OpenRA.Mods.Common/Orders/RepairOrderGenerator.cs index fdb04c2510..a6063ab7c0 100644 --- a/OpenRA.Mods.Common/Orders/RepairOrderGenerator.cs +++ b/OpenRA.Mods.Common/Orders/RepairOrderGenerator.cs @@ -70,7 +70,7 @@ namespace OpenRA.Mods.Common.Orders } public IEnumerable Render(WorldRenderer wr, World world) { yield break; } - public IEnumerable RenderAfterWorld(WorldRenderer wr, World world) { yield break; } + public IEnumerable RenderAboveShroud(WorldRenderer wr, World world) { yield break; } public string GetCursor(World world, CPos cell, int2 worldPixel, MouseInput mi) { diff --git a/OpenRA.Mods.Common/Traits/SupportPowers/GrantUpgradePower.cs b/OpenRA.Mods.Common/Traits/SupportPowers/GrantUpgradePower.cs index 74b54bef5b..1a5aba77fe 100644 --- a/OpenRA.Mods.Common/Traits/SupportPowers/GrantUpgradePower.cs +++ b/OpenRA.Mods.Common/Traits/SupportPowers/GrantUpgradePower.cs @@ -141,7 +141,7 @@ namespace OpenRA.Mods.Common.Traits world.CancelInputMode(); } - public IEnumerable RenderAfterWorld(WorldRenderer wr, World world) + public IEnumerable RenderAboveShroud(WorldRenderer wr, World world) { var xy = wr.Viewport.ViewToWorld(Viewport.LastMousePos); foreach (var unit in power.UnitsInRange(xy)) diff --git a/OpenRA.Mods.Common/Traits/SupportPowers/SupportPowerManager.cs b/OpenRA.Mods.Common/Traits/SupportPowers/SupportPowerManager.cs index b9336983ea..57ed983805 100644 --- a/OpenRA.Mods.Common/Traits/SupportPowers/SupportPowerManager.cs +++ b/OpenRA.Mods.Common/Traits/SupportPowers/SupportPowerManager.cs @@ -291,7 +291,7 @@ namespace OpenRA.Mods.Common.Traits } public IEnumerable Render(WorldRenderer wr, World world) { yield break; } - public IEnumerable RenderAfterWorld(WorldRenderer wr, World world) { yield break; } + public IEnumerable RenderAboveShroud(WorldRenderer wr, World world) { yield break; } public string GetCursor(World world, CPos cell, int2 worldPixel, MouseInput mi) { return world.Map.Contains(cell) ? cursor : "generic-blocked"; diff --git a/OpenRA.Mods.RA/Traits/Minelayer.cs b/OpenRA.Mods.RA/Traits/Minelayer.cs index 8c057eb6c0..a03ebe643b 100644 --- a/OpenRA.Mods.RA/Traits/Minelayer.cs +++ b/OpenRA.Mods.RA/Traits/Minelayer.cs @@ -181,7 +181,7 @@ namespace OpenRA.Mods.RA.Traits CPos lastMousePos; public IEnumerable Render(WorldRenderer wr, World world) { yield break; } - public IEnumerable RenderAfterWorld(WorldRenderer wr, World world) + public IEnumerable RenderAboveShroud(WorldRenderer wr, World world) { if (!minelayers.Any()) yield break; @@ -194,7 +194,7 @@ namespace OpenRA.Mods.RA.Traits var pal = wr.Palette(TileSet.TerrainPaletteInternalName); foreach (var c in minefield) { - var tile = movement.CanEnterCell(c, null, false) ? tileOk : tileBlocked; + var tile = movement.CanEnterCell(c, null, false) && !world.ShroudObscures(c) ? tileOk : tileBlocked; yield return new SpriteRenderable(tile, world.Map.CenterOfCell(c), WVec.Zero, -511, pal, 1f, true); } diff --git a/OpenRA.Mods.RA/Traits/PortableChrono.cs b/OpenRA.Mods.RA/Traits/PortableChrono.cs index ac14f32bee..c80e2290cf 100644 --- a/OpenRA.Mods.RA/Traits/PortableChrono.cs +++ b/OpenRA.Mods.RA/Traits/PortableChrono.cs @@ -194,7 +194,7 @@ namespace OpenRA.Mods.RA.Traits yield break; } - public IEnumerable RenderAfterWorld(WorldRenderer wr, World world) + public IEnumerable RenderAboveShroud(WorldRenderer wr, World world) { if (!self.IsInWorld || self.Owner != self.World.LocalPlayer) yield break; diff --git a/OpenRA.Mods.RA/Traits/SupportPowers/ChronoshiftPower.cs b/OpenRA.Mods.RA/Traits/SupportPowers/ChronoshiftPower.cs index e3ddbb2372..ab5ddddb1d 100644 --- a/OpenRA.Mods.RA/Traits/SupportPowers/ChronoshiftPower.cs +++ b/OpenRA.Mods.RA/Traits/SupportPowers/ChronoshiftPower.cs @@ -151,7 +151,7 @@ namespace OpenRA.Mods.RA.Traits world.CancelInputMode(); } - public IEnumerable RenderAfterWorld(WorldRenderer wr, World world) + public IEnumerable RenderAboveShroud(WorldRenderer wr, World world) { var xy = wr.Viewport.ViewToWorld(Viewport.LastMousePos); var targetUnits = power.UnitsInRange(xy).Where(a => !world.FogObscures(a)); @@ -236,36 +236,19 @@ namespace OpenRA.Mods.RA.Traits world.CancelInputMode(); } - public IEnumerable RenderAfterWorld(WorldRenderer wr, World world) - { - foreach (var unit in power.UnitsInRange(sourceLocation)) - if (manager.Self.Owner.CanTargetActor(unit)) - yield return new SelectionBoxRenderable(unit, Color.Red); - } - - public IEnumerable Render(WorldRenderer wr, World world) + public IEnumerable RenderAboveShroud(WorldRenderer wr, World world) { var xy = wr.Viewport.ViewToWorld(Viewport.LastMousePos); var palette = wr.Palette(power.Info.IconPalette); - // Source tiles - foreach (var t in world.Map.FindTilesInCircle(sourceLocation, range)) - yield return new SpriteRenderable(sourceTile, wr.World.Map.CenterOfCell(t), WVec.Zero, -511, palette, 1f, true); - // Destination tiles foreach (var t in world.Map.FindTilesInCircle(xy, range)) - yield return new SpriteRenderable(sourceTile, wr.World.Map.CenterOfCell(t), WVec.Zero, -511, palette, 1f, true); - - // Unit previews - foreach (var unit in power.UnitsInRange(sourceLocation)) { - var offset = world.Map.CenterOfCell(xy) - world.Map.CenterOfCell(sourceLocation); - if (manager.Self.Owner.CanTargetActor(unit)) - foreach (var r in unit.Render(wr)) - yield return r.OffsetBy(offset); + var tile = manager.Self.Owner.Shroud.IsExplored(t) ? validTile : invalidTile; + yield return new SpriteRenderable(tile, wr.World.Map.CenterOfCell(t), WVec.Zero, -511, palette, 1f, true); } - // Unit tiles + // Unit previews foreach (var unit in power.UnitsInRange(sourceLocation)) { if (manager.Self.Owner.CanTargetActor(unit)) @@ -276,7 +259,25 @@ namespace OpenRA.Mods.RA.Traits var tile = canEnter ? validTile : invalidTile; yield return new SpriteRenderable(tile, wr.World.Map.CenterOfCell(targetCell), WVec.Zero, -511, palette, 1f, true); } + + var offset = world.Map.CenterOfCell(xy) - world.Map.CenterOfCell(sourceLocation); + if (manager.Self.Owner.CanTargetActor(unit)) + foreach (var r in unit.Render(wr)) + yield return r.OffsetBy(offset); } + + foreach (var unit in power.UnitsInRange(sourceLocation)) + if (manager.Self.Owner.CanTargetActor(unit)) + yield return new SelectionBoxRenderable(unit, Color.Red); + } + + public IEnumerable Render(WorldRenderer wr, World world) + { + var palette = wr.Palette(power.Info.IconPalette); + + // Source tiles + foreach (var t in world.Map.FindTilesInCircle(sourceLocation, range)) + yield return new SpriteRenderable(sourceTile, wr.World.Map.CenterOfCell(t), WVec.Zero, -511, palette, 1f, true); } bool IsValidTarget(CPos xy) diff --git a/OpenRA.Mods.TS/Traits/SupportPowers/AttackOrderPower.cs b/OpenRA.Mods.TS/Traits/SupportPowers/AttackOrderPower.cs index 76af6fe64a..5b6160b4e8 100644 --- a/OpenRA.Mods.TS/Traits/SupportPowers/AttackOrderPower.cs +++ b/OpenRA.Mods.TS/Traits/SupportPowers/AttackOrderPower.cs @@ -120,7 +120,7 @@ namespace OpenRA.Mods.TS.Traits IEnumerable IOrderGenerator.Render(WorldRenderer wr, World world) { yield break; } - IEnumerable IOrderGenerator.RenderAfterWorld(WorldRenderer wr, World world) + IEnumerable IOrderGenerator.RenderAboveShroud(WorldRenderer wr, World world) { foreach (var a in instance.Instances.Where(i => !i.Self.IsDisabled())) {