Draw order generator renderables above the shroud.

This commit is contained in:
Paul Chote
2016-08-22 18:38:25 +01:00
parent b016638ebe
commit d2f5fe7380
13 changed files with 40 additions and 37 deletions

View File

@@ -111,9 +111,6 @@ namespace OpenRA.Graphics
worldRenderables = worldRenderables.Concat(World.Effects.SelectMany(e => e.Render(this))); worldRenderables = worldRenderables.Concat(World.Effects.SelectMany(e => e.Render(this)));
worldRenderables = worldRenderables.OrderBy(RenderableScreenZPositionComparisonKey); worldRenderables = worldRenderables.OrderBy(RenderableScreenZPositionComparisonKey);
if (World.OrderGenerator != null)
worldRenderables = worldRenderables.Concat(World.OrderGenerator.RenderAfterWorld(this, World));
Game.Renderer.WorldVoxelRenderer.BeginFrame(); Game.Renderer.WorldVoxelRenderer.BeginFrame();
var renderables = worldRenderables.Select(r => r.PrepareRender(this)).ToList(); var renderables = worldRenderables.Select(r => r.PrepareRender(this)).ToList();
Game.Renderer.WorldVoxelRenderer.EndFrame(); Game.Renderer.WorldVoxelRenderer.EndFrame();
@@ -185,10 +182,15 @@ namespace OpenRA.Graphics
.Where(e => e != null) .Where(e => e != null)
.SelectMany(e => e.RenderAboveShroud(this)); .SelectMany(e => e.RenderAboveShroud(this));
var aboveShroudOrderGenerator = SpriteRenderable.None;
if (World.OrderGenerator != null)
aboveShroudOrderGenerator = World.OrderGenerator.RenderAboveShroud(this, World);
Game.Renderer.WorldVoxelRenderer.BeginFrame(); Game.Renderer.WorldVoxelRenderer.BeginFrame();
var finalOverlayRenderables = aboveShroud var finalOverlayRenderables = aboveShroud
.Concat(aboveShroudSelected) .Concat(aboveShroudSelected)
.Concat(aboveShroudEffects) .Concat(aboveShroudEffects)
.Concat(aboveShroudOrderGenerator)
.Select(r => r.PrepareRender(this)); .Select(r => r.PrepareRender(this));
Game.Renderer.WorldVoxelRenderer.EndFrame(); Game.Renderer.WorldVoxelRenderer.EndFrame();

View File

@@ -19,7 +19,7 @@ namespace OpenRA
IEnumerable<Order> Order(World world, CPos cell, int2 worldPixel, MouseInput mi); IEnumerable<Order> Order(World world, CPos cell, int2 worldPixel, MouseInput mi);
void Tick(World world); void Tick(World world);
IEnumerable<IRenderable> Render(WorldRenderer wr, World world); IEnumerable<IRenderable> Render(WorldRenderer wr, World world);
IEnumerable<IRenderable> RenderAfterWorld(WorldRenderer wr, World world); IEnumerable<IRenderable> RenderAboveShroud(WorldRenderer wr, World world);
string GetCursor(World world, CPos cell, int2 worldPixel, MouseInput mi); string GetCursor(World world, CPos cell, int2 worldPixel, MouseInput mi);
} }
} }

View File

@@ -61,7 +61,7 @@ namespace OpenRA.Orders
public virtual void Tick(World world) { } public virtual void Tick(World world) { }
public virtual IEnumerable<IRenderable> Render(WorldRenderer wr, World world) { yield break; } public virtual IEnumerable<IRenderable> Render(WorldRenderer wr, World world) { yield break; }
public virtual IEnumerable<IRenderable> RenderAfterWorld(WorldRenderer wr, World world) { yield break; } public virtual IEnumerable<IRenderable> RenderAboveShroud(WorldRenderer wr, World world) { yield break; }
public virtual string GetCursor(World world, CPos cell, int2 worldPixel, MouseInput mi) public virtual string GetCursor(World world, CPos cell, int2 worldPixel, MouseInput mi)
{ {

View File

@@ -24,7 +24,7 @@ namespace OpenRA.Mods.Common.Orders
public virtual void Tick(World world) { } public virtual void Tick(World world) { }
public IEnumerable<IRenderable> Render(WorldRenderer wr, World world) { yield break; } public IEnumerable<IRenderable> Render(WorldRenderer wr, World world) { yield break; }
public IEnumerable<IRenderable> RenderAfterWorld(WorldRenderer wr, World world) { yield break; } public IEnumerable<IRenderable> RenderAboveShroud(WorldRenderer wr, World world) { yield break; }
public string GetCursor(World world, CPos cell, int2 worldPixel, MouseInput mi) public string GetCursor(World world, CPos cell, int2 worldPixel, MouseInput mi)
{ {
return "ability"; return "ability";

View File

@@ -62,7 +62,7 @@ namespace OpenRA.Mods.Common.Orders
} }
public IEnumerable<IRenderable> Render(WorldRenderer wr, World world) { yield break; } public IEnumerable<IRenderable> Render(WorldRenderer wr, World world) { yield break; }
public IEnumerable<IRenderable> RenderAfterWorld(WorldRenderer wr, World world) { yield break; } public IEnumerable<IRenderable> RenderAboveShroud(WorldRenderer wr, World world) { yield break; }
public string GetCursor(World world, CPos cell, int2 worldPixel, MouseInput mi) public string GetCursor(World world, CPos cell, int2 worldPixel, MouseInput mi)
{ {

View File

@@ -148,7 +148,7 @@ namespace OpenRA.Mods.Common.Orders
} }
public IEnumerable<IRenderable> Render(WorldRenderer wr, World world) { yield break; } public IEnumerable<IRenderable> Render(WorldRenderer wr, World world) { yield break; }
public IEnumerable<IRenderable> RenderAfterWorld(WorldRenderer wr, World world) public IEnumerable<IRenderable> RenderAboveShroud(WorldRenderer wr, World world)
{ {
var xy = wr.Viewport.ViewToWorld(Viewport.LastMousePos); var xy = wr.Viewport.ViewToWorld(Viewport.LastMousePos);
var topLeft = xy - FootprintUtils.AdjustForBuildingSize(buildingInfo); var topLeft = xy - FootprintUtils.AdjustForBuildingSize(buildingInfo);

View File

@@ -70,7 +70,7 @@ namespace OpenRA.Mods.Common.Orders
} }
public IEnumerable<IRenderable> Render(WorldRenderer wr, World world) { yield break; } public IEnumerable<IRenderable> Render(WorldRenderer wr, World world) { yield break; }
public IEnumerable<IRenderable> RenderAfterWorld(WorldRenderer wr, World world) { yield break; } public IEnumerable<IRenderable> RenderAboveShroud(WorldRenderer wr, World world) { yield break; }
public string GetCursor(World world, CPos cell, int2 worldPixel, MouseInput mi) public string GetCursor(World world, CPos cell, int2 worldPixel, MouseInput mi)
{ {

View File

@@ -141,7 +141,7 @@ namespace OpenRA.Mods.Common.Traits
world.CancelInputMode(); world.CancelInputMode();
} }
public IEnumerable<IRenderable> RenderAfterWorld(WorldRenderer wr, World world) public IEnumerable<IRenderable> RenderAboveShroud(WorldRenderer wr, World world)
{ {
var xy = wr.Viewport.ViewToWorld(Viewport.LastMousePos); var xy = wr.Viewport.ViewToWorld(Viewport.LastMousePos);
foreach (var unit in power.UnitsInRange(xy)) foreach (var unit in power.UnitsInRange(xy))

View File

@@ -291,7 +291,7 @@ namespace OpenRA.Mods.Common.Traits
} }
public IEnumerable<IRenderable> Render(WorldRenderer wr, World world) { yield break; } public IEnumerable<IRenderable> Render(WorldRenderer wr, World world) { yield break; }
public IEnumerable<IRenderable> RenderAfterWorld(WorldRenderer wr, World world) { yield break; } public IEnumerable<IRenderable> RenderAboveShroud(WorldRenderer wr, World world) { yield break; }
public string GetCursor(World world, CPos cell, int2 worldPixel, MouseInput mi) public string GetCursor(World world, CPos cell, int2 worldPixel, MouseInput mi)
{ {
return world.Map.Contains(cell) ? cursor : "generic-blocked"; return world.Map.Contains(cell) ? cursor : "generic-blocked";

View File

@@ -181,7 +181,7 @@ namespace OpenRA.Mods.RA.Traits
CPos lastMousePos; CPos lastMousePos;
public IEnumerable<IRenderable> Render(WorldRenderer wr, World world) { yield break; } public IEnumerable<IRenderable> Render(WorldRenderer wr, World world) { yield break; }
public IEnumerable<IRenderable> RenderAfterWorld(WorldRenderer wr, World world) public IEnumerable<IRenderable> RenderAboveShroud(WorldRenderer wr, World world)
{ {
if (!minelayers.Any()) if (!minelayers.Any())
yield break; yield break;
@@ -194,7 +194,7 @@ namespace OpenRA.Mods.RA.Traits
var pal = wr.Palette(TileSet.TerrainPaletteInternalName); var pal = wr.Palette(TileSet.TerrainPaletteInternalName);
foreach (var c in minefield) 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), yield return new SpriteRenderable(tile, world.Map.CenterOfCell(c),
WVec.Zero, -511, pal, 1f, true); WVec.Zero, -511, pal, 1f, true);
} }

View File

@@ -194,7 +194,7 @@ namespace OpenRA.Mods.RA.Traits
yield break; yield break;
} }
public IEnumerable<IRenderable> RenderAfterWorld(WorldRenderer wr, World world) public IEnumerable<IRenderable> RenderAboveShroud(WorldRenderer wr, World world)
{ {
if (!self.IsInWorld || self.Owner != self.World.LocalPlayer) if (!self.IsInWorld || self.Owner != self.World.LocalPlayer)
yield break; yield break;

View File

@@ -151,7 +151,7 @@ namespace OpenRA.Mods.RA.Traits
world.CancelInputMode(); world.CancelInputMode();
} }
public IEnumerable<IRenderable> RenderAfterWorld(WorldRenderer wr, World world) public IEnumerable<IRenderable> RenderAboveShroud(WorldRenderer wr, World world)
{ {
var xy = wr.Viewport.ViewToWorld(Viewport.LastMousePos); var xy = wr.Viewport.ViewToWorld(Viewport.LastMousePos);
var targetUnits = power.UnitsInRange(xy).Where(a => !world.FogObscures(a)); var targetUnits = power.UnitsInRange(xy).Where(a => !world.FogObscures(a));
@@ -236,36 +236,19 @@ namespace OpenRA.Mods.RA.Traits
world.CancelInputMode(); world.CancelInputMode();
} }
public IEnumerable<IRenderable> RenderAfterWorld(WorldRenderer wr, World world) public IEnumerable<IRenderable> RenderAboveShroud(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<IRenderable> Render(WorldRenderer wr, World world)
{ {
var xy = wr.Viewport.ViewToWorld(Viewport.LastMousePos); var xy = wr.Viewport.ViewToWorld(Viewport.LastMousePos);
var palette = wr.Palette(power.Info.IconPalette); 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 // Destination tiles
foreach (var t in world.Map.FindTilesInCircle(xy, range)) 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); var tile = manager.Self.Owner.Shroud.IsExplored(t) ? validTile : invalidTile;
if (manager.Self.Owner.CanTargetActor(unit)) yield return new SpriteRenderable(tile, wr.World.Map.CenterOfCell(t), WVec.Zero, -511, palette, 1f, true);
foreach (var r in unit.Render(wr))
yield return r.OffsetBy(offset);
} }
// Unit tiles // Unit previews
foreach (var unit in power.UnitsInRange(sourceLocation)) foreach (var unit in power.UnitsInRange(sourceLocation))
{ {
if (manager.Self.Owner.CanTargetActor(unit)) if (manager.Self.Owner.CanTargetActor(unit))
@@ -276,7 +259,25 @@ namespace OpenRA.Mods.RA.Traits
var tile = canEnter ? validTile : invalidTile; var tile = canEnter ? validTile : invalidTile;
yield return new SpriteRenderable(tile, wr.World.Map.CenterOfCell(targetCell), WVec.Zero, -511, palette, 1f, true); 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<IRenderable> 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) bool IsValidTarget(CPos xy)

View File

@@ -120,7 +120,7 @@ namespace OpenRA.Mods.TS.Traits
IEnumerable<IRenderable> IOrderGenerator.Render(WorldRenderer wr, World world) { yield break; } IEnumerable<IRenderable> IOrderGenerator.Render(WorldRenderer wr, World world) { yield break; }
IEnumerable<IRenderable> IOrderGenerator.RenderAfterWorld(WorldRenderer wr, World world) IEnumerable<IRenderable> IOrderGenerator.RenderAboveShroud(WorldRenderer wr, World world)
{ {
foreach (var a in instance.Instances.Where(i => !i.Self.IsDisabled())) foreach (var a in instance.Instances.Where(i => !i.Self.IsDisabled()))
{ {